2016-10-18 2 views
1

Ich habe eine Klasse, die zwei optionale Felder "TeamOne" vom Typ "Team" und "TeamTwo" vom Typ "Team" hat. Teams können natürlich existieren, ohne einem Spiel zugeordnet zu sein und werden nicht gelöscht, wenn ein Spiel gelöscht wird und umgekehrt.Entity Framework mehrere optionale Beziehungen des gleichen Typs mit fluentapi

Jetzt versuche ich, die Beziehungen auf diese Weise festgelegt:

HasOptional(x => x.TeamOne).WithOptionalDependent(x => x.Game).WillCascadeOnDelete(false); 
HasOptional(x => x.TeamTwo).WithOptionalDependent(x => x.Game).WillCascadeOnDelete(false); 

ich in den Fehler ist

Schema angegeben leite nicht gültig. Fehler: Die Beziehung 'Infrastructure.DAL.Match_TeamOne' wurde nicht geladen, da der Typ 'Infrastructure.DAL.Team' nicht verfügbar ist.

Mache ich hier etwas falsch?

edit: 1 Spiel: 1 TeamOne und 1 teamtwo TeamOne und teamtwo zugeordnet sind 1 Spiel max

+0

Ich denke, Sie müssen mehr Informationen zur Verfügung stellen, nicht viel, um derzeit zu gehen. Vielleicht geben Sie mehr Kontext um die eigentliche Fehlermeldung. Aus dem Fehler geht hervor, dass das Schema nicht angegeben ist. Nicht sicher, ob Sie Migrationen verwenden, aber vielleicht haben Sie die Datenbank nicht mit dem neuen Schema aktualisiert? – Tony

+0

Ich mache automatische Migrationen. Schemata scheinen aktuell zu sein. –

+0

Die Fehlermeldung besagt, dass der Typ nicht verfügbar ist. Dies kann zu nicht öffentlichen Eigenschaften (oder ohne ordnungsgemäße Getters/Setter) oder zu fehlerhafter Kompilierung der Assembly führen. – DevilSuichiro

Antwort

2

Sie versuchen mit einem inversem Ende zwei Beziehungen zu schaffen. Sowohl Game.TeamOne als auch Game.TeamTwo beziehen sich auf Team.Game. Jedoch, wenn Sie von Team kommen, auf die Game sollte sich beziehen Team.Game? Die, in der es ist TeamOne oder TeamTwo? Da ist eine Zweideutigkeit. Sie benötigen eine zweite Eigenschaft des Typs Game, um an TeamTwo zu binden. Das würde funktionieren:

HasOptional(x => x.TeamOne).WithOptionalDependent(x => x.HomeGame).WillCascadeOnDelete(false); 
HasOptional(x => x.TeamTwo).WithOptionalDependent(x => x.AwayGame).WillCascadeOnDelete(false); 

Aber ich denke nicht, dass dieses Modell richtig sein kann. Kann ein Team wirklich nur eine Game haben? Das ist ein interessantes Wettbewerbsmodell! Ich denke, dass Teams in „viele“ Spiele spielen können, und die Abbildung sollte wie folgt aussehen:

HasOptional(x => x.TeamOne).WithMany(x => x.HomeGames) 
        .WillCascadeOnDelete(false) 
HasOptional(x => x.TeamTwo).WithMany(x => x.AwayGames) 
        .WillCascadeOnDelete(false) 

... wo HomeGames und AwayGames sind public (virtual) ICollection<Game>.

+0

Ja, ich habe gerade bemerkt, was das Problem wirklich ist ... Ja, ein Team kann nur ein Spiel gleichzeitig spielen. Wenn Sie an "Spiel" denken, denken Sie eher an ein Spiel. Wie Deutschland gegen England zum Beispiel.Deutschland wird nicht zwei Spiele gleichzeitig spielen. In meinem Fall gibt es jedoch kein Heim- und Auswärtsteam. Sie sind technisch beide Auswärtsmannschaften. Ich möchte nicht zwei Tabellen für das wortwörtlich identische Entity managen müssen. Es muss einen Weg geben? –

+0

Ein Spiel nach dem anderen, ja. Aber willst du nicht nur ein Spiel pro Team speichern? Wie auch immer, wenn Sie dies tun, können Sie das erste Mapping verwenden und die Eigenschaftsnamen anpassen. Oder verwenden Sie Ihr eigenes Mapping und ersetzen Sie einen 'WithOptionalDependent'-Aufruf durch einen mit einem leeren Parameter:' WithOptionalDependent() '. Beachten Sie, dass in diesem Modell ein Team * in zwei Spielen gleichzeitig sein kann, als TeamOne in der ersten und als TeamTwo in der zweiten. –

Verwandte Themen