Entity Framework Performance-Probleme Kind Hinzufügen zur Liste

stimmen
1

Ich arbeite an einem Projekt, wo wir Entity Framework 6.1.3 verwenden. Im Moment sind wir ziemlich große Performance-Probleme auftreten, wenn ein Kind Objekt auf eine Liste der Muttergesellschaft hinzugefügt werden (siehe Codebeispiel unten).

Wir verwenden faul-Laden, also was mir aufgefallen ist , dass alles funktioniert gut , bis wir nennen , _parent.Children.Add(child);da es alle Kinder aus der Datenbank zu laden scheint nur in der Lage sein , eine neue hinzuzufügen. Da einige unserer übergeordneten Objekte etwa 50.000 Kinder haben, ist diese Verzögerung diesen einfachen Einsatz Anruf von 7-8 Sekunden und manchmal sogar Timeouts verursachen.

Für mich ist es nicht wirklich sinnvoll für Entity Framework alle Kinder zu laden, nur um eine hinzuzufügen, so ist es eine Möglichkeit, dies vermeiden kann oder ist dies ein Entity Framework Design-Fehler und sollten wir eine Abhilfe finden?

Ich möchte natürlich eine Lösung dafür finden und würde es vorziehen, nicht rein ADO-Abfragen für diese ein Problem implementieren zu müssen.

Vielen Dank!

public class Parent 
{
    public Guid Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

public class Child
{
    public Guid Id { get; set; }
}

public class ParentAggregate
{
    private readonly Parent _state;

    public ParentAggregate(Parent state)
    {
        _state = state;
    }

    public void AddChild(Guid id)
    {
        var child = new Child { Id = id };
        _state.Children.Add(child);
    }
}
Veröffentlicht am 19/12/2018 um 14:16
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Für mich ist es nicht wirklich sinnvoll für Entity Framework alle Kinder zu laden, nur um einen hinzufügen

Der verzögertes Laden tritt das erste Mal , wenn Sie Zugriff auf eine Navigationseigenschaft durch die Getter . Und der Beispielcode

_parent.Children.Add(child);

besteht aus zwei Vorgängen:

(1) rufen Sie die ChildrenEigenschaft (über die Eigenschaft Getter !):

var children = _parent.Children;

(2) eine Operation durchführt darauf Add(Anrufverfahren in diesem Fall):

children.Add(child);

Der träges Laden tritt aufgrund der Operation (1). Wie Sie sehen können, hat EF nichts damit zu tun , weil es keine Kontrolle darüber hat. Und es gibt keine Möglichkeit zu wissen , was Sie mit dieser Eigenschaft Wert tun werden - aufzählen es, nimmt eine Zählung oder Verwendung Add, Removeusw. Methoden.

Hier sind einige Lösungen.

Erstens, warum mit überhaupt träges Laden? Es hat so viele Nebenwirkungen und Ineffizienzen, und alle können sie leicht von EF aus der Box eifrig Laden über vorgesehen gelöst werden IncludeMethoden. Deshalb standardmäßig EF Core ( „die Zukunft von EF“) nicht verzögertes Laden als Standard verwenden und erfordert ein spezielles Paket und das Verfahren für sie zu ermöglichen.

Zweitens, wenn Sie verzögertes Laden bestehen verwenden, dann haben Sie die folgenden zwei Möglichkeiten:

(A) DISABLE träges Laden während der Datenänderungen (erfordert den Zugriff auf / Steuerung der DbContextInstanz):

dbContext.Configuration.LazyLoadingEnabled = false;
_parent.Children.Add(child);
dbContext.Configuration.LazyLoadingEnabled = true;

Dies erfordert auch die Sammlung Eigenschaft, um NRE zu vermeiden initialisiert werden.

(B) Verwenden Sie explizite Unterstützung Feld und bieten einige direkten Zugang zu ihm (Auslösung der faulen Belastung durch Eigenschaftenaccessor zu vermeiden). Zum Beispiel:

public class Parent 
{
    public Guid Id { get; set; }

    private ICollection<Child> children;
    public virtual ICollection<Child> Children { get => children; set => children = value; }

    public void Add(Child child)
    {
        // use the backing field directly
        if (children == null) children = new HashSet<Child>();
        children.Add(child); 
    }
}
Beantwortet am 19/12/2018 um 15:20
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more