Vielzahl constraint verletzt SQL Server 2008 - CodeFirst
Ich bin der Lösung ein sehr mühsames problem.
Ich habe eine Klasse namens "Nation" und eine Klasse namens National
public class Nation
{
public int ID {get; set;}
public int name {get;set;}
public List<NationAlly> NationAllies {get;set;}
}
public class NationAlly
{
public int ID {get; set;}
public int level {get;set;}
public Nation toNation {get;set;}
}
Ich bin mit EF-4 und CodeFirst mit einem DbContext genannt NationsDB für die Verwaltung meiner Datenbank auf dem SQL-Server 2008.
Wenn ich ein neues Objekt vom Typ Nation, und ich versuche zu nennen, nationsDB.SaveChanges, habe ich die folgende exception:
"Vielzahl constraint verletzt. Die Rolle des "NationAlly_toNation_Target' der Beziehung 'CodeFirstNamespace.NationAlly_toNation' hat die Kardinalität 1 oder 0..1."
Ich versuchte zu retten, eine Nation mit NationAllies Feld null ist, und diese exception wird nicht geworfen, der nation-Tabelle in der Datenbank wird alle die richtigen Werte.
In meiner Datenbank die Tabelle Nation hat 2 Felder: ID(Primärschlüssel) - name
Der Tabelle National hat 3 Felder: ID(Primärschlüssel), Ebene, NationID
Die beiden Tabellen sind verknüpft mit einer Beziehung, wo auf Nationaler Ebene.NationID ist Fremdschlüssel und Nation.ID ist primary key.
Ist das nicht seltsam? In meinen Augen ist der Tabelle National sollte ein Feld namens NationID1 und anderen genannt NationID2 zu erstellen, die "Beziehung" zwischen einer nation und einer Liste von anderen Nationen.
Was habe ich falsch gemacht?
- Ist
NationAlly
darstellen soll, eine viele-zu-viele-Beziehung? d.h., Eine nation hat viele Verbündete, und kann auch ein Verbündeter sein, um viele Nationen? - Eine Nation als natürlich viele NationAllies, da in der nation gibt es eine Liste mit National Entitäten. Ein single National entity hat eine und nur eine Nation, die die "Besitzer" der nation (wer hat die Liste, die auf Nationaler Ebene) und eine und nur eine Nation, die die "toNation", zu dem die Beziehung auf.
- Wann genau bekommst du die Ausnahme? Sie schreiben, dass Sie "erstellen Sie ein neues Objekt vom Typ Nation" SaveChanges aufrufen, und die exception wird geworfen. Zwei Absätze weiter unten schreiben Sie: "ich versuchte zu retten, eine Nation mit NationAllies Feld null ist, und diese exception wird nicht geworfen." Wo ist der Unterschied? Fügen Sie NationAllies im ersten Fall?
- Die Ausnahme wird ausgelöst, wenn ich SaveChanges aufrufen. In den anderen Absatz ich war nur zu beschreiben, dass keine Ausnahme wird geworfen, wenn ich verlassen das Feld NationAllies null.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie vielleicht ein Opfer von den EF Code-First-mapping-Konventionen, die erstellen automatisch eine Beziehung zwischen
NationAllies
undtoNation
Sie nicht haben wollen.Wenn ich Sie richtig verstehe (aber ich bin nicht 100 Prozent sicher, ob ich es tun), Sie wirklich wollen, um zwei Beziehungen, und Sie aufgedeckt haben, nur ein Ende der Beziehung in den einzelnen Entitäten. Also
NationAllies
NICHT auftoNation
aber um eine "unsichtbare" Besitzer nation in IhremNationAlly
Einheit.Wenn das der Fall ist, müssen Sie explizit überschreiben des übereinkommens Zuordnungen. In der Fluent-API von EF 4.1 diese könnte wie folgt Aussehen:
Diese Zuordnung schaffen würde, die zwei Fremdschlüssel
OwnerID
undNationID
imNationAllies
Tisch, beide verweisen auf den PrimärschlüsselID
imNations
Tabelle.Bearbeiten
Hier ist die Anwendung, die ich getestet habe, mit:
Inhalt des Programms.cs:
Können Sie einen Haltepunkt auf "werfen" zu beobachten, mögliche Ausnahmen in e in den debugger.
Dieser erstellt eine Datenbank namens
NationsApp.NationsContext
wenn Sie SQL Server Express verwenden und haben keine weitere Verbindung strings definiert.Es gibt zwei Beziehungen
Nation_NationAllies
(FK ist "OwnerID") undNationAlly_toNation
(FK ist "NationID"). Alle Spalten sind keine null-Werte zulassen. Das Ergebnis in der DB ist folgende:EntityFramework.dll
, nicht nur System.Daten.Entität.OnModelCreating
oder nur den code in meiner Antwort? Haben Sie Attribute auf Ihrer Modell-Klassen? Sind die beiden KlassenNation
undNationAlly
genau so, wie du gezeigt hast am Anfang von deiner Frage? Oder gibt es zusätzliche Navigations-Eigenschaften? Ich Frage das alles so genau, weil ich reproduziert haben das Beispiel mit den zwei Klassen und der model-builder-code in meine Antwort - und ich bekomme nur 2 Beziehungen, wie ich Sie beschrieben hatte. Etwas wichtiges muss anders sein oder fehlen... Können Sie die details zu prüfen?In diesem Fall hilft jemand diese Fehlermeldung bekommen... ich bekam diese Meldung, während Sie Abfragen eher als das speichern in der Datenbank. Meine Daten design:
War das problem in den Konstruktor. Stellt sich heraus, EF4.1 mag es nicht, wenn Sie Sie initialisieren Verbände gibt! Ich entfernt, dass der Konstruktor und die Dinge begannen wieder zu arbeiten.