Analizza le relazioni dell'entità di Entity Framework in generale

3

Ho un'applicazione con un database che non consente le eliminazioni a cascata. Quando un utente va a eliminare un'entità, vorrei visualizzare un popup che dice qualcosa di generico come "Questo record ha dipendenze che devono essere cancellate per prime".

Per supportare questo, speravo di scrivere del codice che potesse prendere genericamente un'entità, controllare le proprietà virtuali e, se esistono, scorrere iteramente per vedere se esistono dei record. Se ne trova uno, restituirà immediatamente true.

L'obiettivo sarebbe quello di restituire un vero / falso con il minor carico possibile il più pigro.

Prima di scrivere il codice per farlo, volevo solo vedere se qualcuno lo ha già fatto prima. Immagino di poter cercare l'eccezione, ma generalmente non mi piace programmare le eccezioni.

    
posta AnotherDeveloper 27.03.2017 - 20:15
fonte

2 risposte

0

Questo è piuttosto approssimativo, ma realizza ciò che stavo cercando di fare:

internal static bool HasChildren(object obj)
{
    //Get Properties
    var props = obj.GetType().GetProperties();
    foreach (var property in props)
    {
        //Look for Navigation Properties
        if (property.GetGetMethod().IsVirtual)
        {
            var value = property.GetValue(obj);
            //Typically instantiated, but just in case, look for null
            if (value != null)
            {
                //Since most navigation propertie are HastSet<T>, it's going to be tough trying to
                //reflect on the object using a type. Going to look for a count prop instead.
                if (property.PropertyType.GetProperty("Count") != null)
                {
                    var count = property.PropertyType.GetProperty("Count").GetValue(value);
                    if (Convert.ToInt16(count) > 0)
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}
    
risposta data 28.03.2017 - 00:04
fonte
2

Vorrei andare con l'approccio di @ Robert di cercare di cancellare il record prima. Se non ci sono dipendenze, allora cancella. In caso contrario, si ottiene una violazione del vincolo.

Se ottieni una violazione del vincolo, dovrai ottenere l'elenco delle chiavi esterne per quella tabella e quindi interrogare ogni tabella per l'ID che desideri rimuovere. Se il conteggio è maggiore di 0, si ha una dipendenza. Inoltre, l'errore di violazione del vincolo probabilmente elenca le tabelle coinvolte in modo da poter analizzare l'errore di vincolo per risolvere il problema.

Esistono diverse risposte di overflow dello stack esistenti che discutono su come identificare le chiavi esterne su un tavolo.

Tieni presente che se hai relazioni profonde e annidate, potrebbero esserci molte dipendenze da controllare ed elencare.

    
risposta data 27.03.2017 - 20:57
fonte

Leggi altre domande sui tag