Ich arbeite daran, ein sehr langwieriges Problem zu lösen. Ich habe eine Klasse namens Nation und eine Klasse namens NationAlly
%Vor%Ich verwende EF 4 und CodeFirst mit einem DbContext namens NationsDB, um meine Datenbank auf SQL Server 2008 zu verwalten. Wenn ich ein neues Objekt vom Typ Nation erstelle und versuche, nationsDB.SaveChanges aufzurufen, habe ich folgende Ausnahme:
"Multiplikationsbedingung verletzt. Die Rolle 'NationAlly_toNation_Target' der Beziehung 'CodeFirstNamespace.NationAlly_toNation' hat Multiplizität 1 oder 0..1."
Ich habe versucht, eine Nation mit NationAllies-Feld null zu speichern, und diese Ausnahme wird nicht ausgelöst, die Nation-Tabelle in der Datenbank erhält alle korrekten Werte.
In meiner Datenbank hat die Tabelle Nation 2 Felder: ID (Primärschlüssel), Name Die Tabelle NationAlly hat 3 Felder: ID (Primärschlüssel), Level, NationID Die beiden Tabellen sind mit einer Beziehung verknüpft, in der NationAlly.NationID der Fremdschlüssel und Nation.ID der Primärschlüssel ist.
Ist das nicht seltsam? In meinen Augen sollte der Tisch NationAlly ein Feld namens NationID1 und ein anderes namens NationID2 haben, um die "Beziehung" zwischen einer Nation und einer Liste anderer Nationen zu schaffen.
Was habe ich falsch gemacht?
Sie sind vielleicht ein Opfer der Mapping-Konventionen von EF Code-First, die automatisch eine Beziehung zwischen NationAllies
und toNation
erstellen, die Sie nicht haben möchten.
Wenn ich Sie richtig verstehe (aber ich bin mir nicht 100 Prozent sicher, wenn ich das tue), möchten Sie eigentlich zwei Beziehungen haben und Sie haben nur ein Ende der Beziehung in jeder der Entitäten bloßgelegt. % Co_de% zeigt also NICHT auf NationAllies
, sondern auf eine "unsichtbare" Eigentümernation in Ihrer Entität toNation
.
Wenn dies der Fall ist, müssen Sie die Konventionen explizit überschreiben. In der Fluent API von EF 4.1 könnte das so aussehen:
%Vor% Diese Zuordnung würde die zwei Fremdschlüssel NationAlly
und OwnerID
in der Tabelle NationID
erstellen, die beide auf den Primärschlüssel NationAllies
in der Tabelle ID
verweisen.
Bearbeiten
Hier ist die Anwendung, die ich getestet habe:
Inhalt von Program.cs:
%Vor%Sie können einen Haltepunkt auf "throw" setzen, um mögliche Ausnahmen in e im Debugger zu beobachten.
Dadurch wird eine Datenbank namens Nations
erstellt, wenn Sie SQL Server Express verwenden und keine weiteren Verbindungszeichenfolgen definiert sind.
Es gibt zwei Beziehungen NationsApp.NationsContext
(FK ist "OwnerID") und Nation_NationAllies
(FK ist "NationID"). Alle Spalten sind nicht nullfähig. Das Ergebnis in der Datenbank lautet wie folgt:
Falls dies jemand hilft, diesen Fehler zu bekommen ... Ich habe diese Nachricht erhalten, während ich Abfragen durchgeführt habe, anstatt in der Datenbank zu speichern. Mein Datenentwurf:
%Vor%Das Problem lag im Konstruktor. Es stellt sich heraus, EF4.1 mag nicht, wenn Sie dort Verbände zu initialisieren! Ich habe diesen Konstruktor entfernt und die Dinge haben wieder funktioniert.
Tags und Links entity-framework sql-server-2008 code-first