2017-12-30 17 views
0

Ich arbeite an einer ASP.NET MVC-Website und verwende Entity Framework zum Speichern/Aktualisieren von Daten in einer MySQL-Datenbank.Clear Entity Framework-Kontext für Ausnahme

ich ninject bin mit DbContext in meine Repository-Klasse zu injizieren wie unten:

public class MyRepository : IMyRepository 
{ 
    MyContext _context; 

    public MyRepository(MyContext context) 
    { 
     _context = context; 
    } 

    // more code ... 

Dies ist, wie ich den Kontext am Injektion mit ninject:

kernel.Bind<MyContext>().ToSelf().InSingletonScope(); 

Und ich bin mit dem injizierten DbContext wie unten, um die Daten in meine Datenbank zu speichern:

public void InsertModel(MyModel r) 
{ 
    _context.MyModel.Add(r); 
    _context.SaveChanges(); 
} 

Jetzt, Das Problem, das ich gegenüberstellen, ist, dass Entity Framework eine Ausnahme auslöst, wenn eine Ausnahme auftritt (z. B. wenn ich absichtlich ein ungültiges Modell übergebe). Die ungültige Entität bleibt im dbContext und alle weiteren save Versuche werden daher fehlschlagen.

Ich habe googeln dieses Problem und fand This Article die speichern/aktualisieren Betrieb in einem try/catch Block schlägt setzen. Wenn eine Ausnahme auftritt, wird empfohlen, dbContext im Block catch zu löschen.

Ist das die richtige Appraoch? Es klingt wie eine Menge Arbeit, um eine try/catch um alle speichern Betrieb und löschen Sie den dbContext? Ich würde jede Hilfe bei der Erläuterung des richtigen Ansatzes zur Klärung des Kontextes zu schätzen wissen.

Antwort

2

Ich würde jede Hilfe bei der Erklärung des richtigen Ansatzes zur Klärung des Kontexts zu schätzen wissen.

Ihr DbContext sollte auf eine einzelne Webanfrage beschränkt sein und wird am Ende der Anfrage zerstört.

2

einfach auf die von @ David Browne gegebenen Antwort gibt, ist es empfehlenswert, eine DbContext per Web Antrag zu erstellen: dbContext lifecycle management

DbContext Leicht und ist zu schaffen, nicht teuer, also keine Sorge über die Leistung: MSDN

Wenn Sie ninject verwenden, können Sie InRequestScope statt InSingletonScope verwenden. InRequestScope stellt die Lebensdauer Ihres Entity Framework sicher dbContext überschreitet nicht die Lebensdauer Ihrer Http WebRequest und stellt Ihren dbContext am Ende jeder Anfrage frei.

kernel.Bind<MyContext>().ToSelf().InRequestScope(); 

Side Hinweis: Wenn Sie Repository-Muster verwenden, stellen Sie sicher, dass Sie verwenden InRequestScope für das Repository als auch. Das Repository ist von dbContext abhängig und es wird ein Problem auftreten, wenn Ihr dbContext entfernt wird, während das Repository noch verwendet wird.

kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope(); 
+0

Ich habe das gleiche Problem wie von @Esfandiyar beschrieben, ich habe versucht, InRequestScope() zu verwenden, kann aber nicht funktionieren. Ich verwende ein generisches Repository, und mein Bindungscode lautet "kernel.Bind (typeof (IGenericRepository <>)). To (typeof (GenericRepository <>))". Aber mein Kontext wird nicht pro Anfrage zerstört. Irgendwelche Vorschläge dafür? –

+0

Fügen Sie Ihrer ninject-Bindung InRequestScope hinzu: kernel.Bind (typeof (IGenericRepository <>)). To (typeof (GenericRepository <>)). InRequestScope() – Sarhang

Verwandte Themen