InnerException in Entity Framework, wenn ich versuche, eine Entität hinzuzufügen
Ich versuche Sie zum einfügen eines Elements in meine Datenbank mit Entity Framework. Siehe unten:
private void InsertarIntoDataBase()
{
Juego game = db.games.First(g => g.Id == anId);
Day d = new Day {
DayNumber = this.Number,
Game = game //This is a relationship. One Day has one game
};
db.AddToDay(d);
db.SaveChanges();
}
Dies ist immer für eine insert -, ein update. Das erste mal, dass ich meine app, es funktioniert, danach nicht mehr funktioniert, werfen diese Ausnahme An error occurred while updating the entries. See the InnerException for details.
. (Ich bin mir wirklich sicher, dass ich nicht nichts ändern).
Warum wird der Rahmen denke ich aktualisiere? Und was mache ich falsch?
InformationsquelleAutor Cristhian Boujon | 2013-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bedeutet es nicht, dass Sie dabei sind, ein Update, bedeutet lediglich, dass ein SQL-Fehler aufgetreten. Sie benötigen zum Lesen die innere Ausnahme, um herauszufinden, was der tatsächliche Fehler ist. Von den blicken von ihm, es könnte etwas im Zusammenhang mit einem primary key oder foreign key-Einschränkung, dh. Sie sind das hinzufügen ein Element und das primär-Schlüssel bereits in der Tabelle. Aber nochmals, der tatsächliche Fehler wird Ihnen mehr details.
Wenn Sie mit Visual Studio sollte es automatisch Pause auf die Ausnahme, und Sie können erweitern die innere exception-Eigenschaft. Wenn nicht, können Sie einen try/catch-block, und melden Sie es in eine Datei zu schreiben oder eine Konsole. Ausnahme.ToString() zeigt alle inneren Ausnahmen, wie auch SQL-Fehler neigen dazu, wickeln Sie den wahren Fehler innerhalb ein paar andere Ausnahmen.
System.Exception
. Immer eine Besondere Ausnahme.Fangen Sie eine Ausnahme, wenn Sie wollen, um die Art der Ausnahme, die in einer bestimmten Art und Weise. Da der Fragesteller nicht weiß, der Grund, warum seine SaveChanges scheiterte, schlug ich vor, Sie fangen die exception-und logging es irgendwo, um die wahre Ursache. Eine einfache Lösung für ein einfaches problem.
Sollten Sie sich nie " catch
System.Exception
sollten Sie immer lassen Sie es propagieren den Stapel. Dies sind die Fehler, die behandelt werden sollten, durch das Debuggen und testen. Finden Sie in diesem Msdn-Thema als schnelle Referenz (msdn.microsoft.com/en-us/library/ms229005.aspx). Es gibt unzählige Ressourcen auf, warum sollten Sie dies nicht tun, auch hier auf ALSO.Ich würde sagen, Fang eine Ausnahme, und nichts zu tun mit es ist eine schlechte Praxis, weil Sie versteckt sind, die den Fehler, aber wenn Sie fangen es und melden Sie es, können Sie dann weiter ODER wieder die Ausnahmen in den stack. Ich werde Bearbeiten, um zu zeigen, dass die Wahl, aber ich weiß nichts über sein Programm und das, was es tun soll, so überlasse ich diese Entscheidung dem Autor.
Zu sagen "Nie" unabhängig von Kontext scheint etwas absolutes hier. Es braucht nicht viel Phantasie, um zu denken an Szenarien, wo dies sehr schwer zu vermeiden. Umgang mit unbestimmten 3rd-party-plugins, die werfen könnte etwas zum Beispiel. Oder bei der letzten Anlaufstelle in einem webservice (so dass eine vollständige Ausnahme und die stapelablaufverfolgung details zum austreten ist nicht eine gute Sache). Faustregeln sind gut. Blinde festhalten ist nicht.
InformationsquelleAutor Despertar
SaveChanges
werfen wirdSystem.Data.Entity.Infrastructure.DbUpdateException
wenn Sie Ihre update-Befehl schlägt fehl, und es hüllt einSystem.Data.UpdateException
dass endlich umschließt einSystem.Data.SqlClient.SqlException
. Es ist auch wichtig zu notieren, dass die innere-innere Ausnahme kann etwas anderes sein als einSqlException
je nach dem Entity-Framework-provider Sie verwenden.Wenn Sie packen Sie diese, können Sie runter, um die raw -
SqlError
Objekte, geben Sie die spezifischen details über Probleme mit dem update.Können Sie auch gewinnen eine Menge von macht und Kontrolle durch fangen
System.Data.Entity.Validation.DbEntityValidationException
die Ihnen zeigen, wird jeder Fehler bei der Validierung aufgetreten, dass bei dem AufrufSaveChanges
. Das Standard-Verhalten ist zur überprüfung der änderungen auf speichern. Sie können auch pre-überprüfung der änderungen durch den AufrufDbContext.GetValidationErrors()
.InformationsquelleAutor David Anderson
Basierend auf Despertar Antwort konnte ich mein problem gelöst.
Entity Framework hat eine option namens
StoreGeneratedPattern
. Diese option zeigt das Verhalten, wenn Sie benötigen, um eine primäre Schlüssel-id. Standardmäßig ist die option "None", wenn Sie so wollen, die autoincrement, setzen Sie die optionStoreGeneratedPattern
als "Identität" . Diese ist der link, den ich gelesen habe.InformationsquelleAutor Cristhian Boujon
Ja ... Immer sicherstellen, dass, wenn unsere Gesellschaften hat guids dann "StoreGeneratedPattern" - set mit dem Wert "Identität". weil standardmäßig sqlserver doesnot hinzufügen, Werte für guid-Spalten.
Es kann eingestellt werden, von edmx durch Auswahl von entity-Rechte Maustaste-Eigenschaften-wählen Sie guid-Spalte-Satz storedGeneratedPattern Identität.
Oder durch die Zuweisung 'Guid.newGuid()' Wert der Spalte aus dem code selbst.
ex. Produkt.Id = Guid.newGuid();
InformationsquelleAutor sachin