Die Multiplikationsbedingung hat SQL Server 2008 - CodeFirst verletzt

8

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?

    
Francesco 24.03.2011, 17:15
quelle

2 Antworten

11

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:

  • Erstellen Sie eine neue Konsolenanwendung in VS2010 / .NET 4.0, nennen Sie sie "NationsApp"
  • Fügen Sie einen Verweis auf "EntityFramework.dll"
  • hinzu
  • Löschen Sie den Inhalt von "Program.cs" und fügen Sie stattdessen Folgendes in
  • ein

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:

    
Slauma 24.03.2011, 19:50
quelle
6

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.

    
ChetPrickles 15.12.2011 15:27
quelle