public class Foo
{
public string FooId{get;set;}
public Boo Boo{get;set;}
}
public class Boo
{
public string BooId{get;set;}
public Foo Foo{get;set;}
}
Ich habe versucht, dies in Entity Framework zu tun, als ich den Fehler bekam:
Das Hauptende einer Zuordnung zwischen den Typen 'ConsoleApplication5.Boo' und 'ConsoleApplication5.Foo' kann nicht ermittelt werden. Das Hauptende dieser Zuordnung muss explizit mithilfe der API für fließende Beziehungen oder mithilfe von Datenanmerkungen konfiguriert werden.
Ich habe Fragen zu StackOverflow mit einer Lösung für diesen Fehler gesehen, möchte aber verstehen, was der Begriff "Hauptende" bedeutet.
c#
entity-framework
database-design
foreign-key-relationship
Taher Chhabrawala
quelle
quelle
Antworten:
In einer Eins-zu-Eins-Beziehung muss ein Ende prinzipiell und das zweite Ende abhängig sein. Das Hauptende ist dasjenige, das zuerst eingefügt wird und das ohne das abhängige existieren kann. Das abhängige Ende muss nach dem Principal eingefügt werden, da es einen Fremdschlüssel für den Principal hat.
Im Falle eines Entity Frameworks muss FK in Dependent auch dessen PK sein. In Ihrem Fall sollten Sie also Folgendes verwenden:
Oder fließendes Mapping
quelle
Foo
das dann der Auftraggeber ist?Boo
ist die abhängige, benötigt eineFoo
, und bekommt den Fremdschlüssel.Foo
ist der Auftraggeber und kann ohne a existierenBoo
.Sie können auch das
[Required]
Datenanmerkungsattribut verwenden, um dies zu lösen:Foo
ist erforderlich fürBoo
.quelle
Boo
soeben aus der Datenbank abgerufene Version zu aktualisieren , es sei denn, Sie lösen zuerst das verzögerte Laden derFoo
Eigenschaft aus. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
virtuell sein?Dies bezieht sich auf die Antwort von @Ladislav Mrnka zur Verwendung einer fließenden API zum Konfigurieren einer Eins-zu-Eins-Beziehung.
Hatte eine Situation, in der
FK of dependent must be it's PK
es nicht machbar war.ZB hat
Foo
schon eine Eins-zu-Viele-Beziehung zuBar
.Jetzt mussten wir eine weitere Eins-zu-Eins-Beziehung zwischen Foo und Bar hinzufügen.
So spezifizieren Sie eine Eins-zu-Eins-Beziehung mit fließender API:
Beachten Sie, dass beim Hinzufügen
PrimaryBarId
entfernt werden muss, da wir dies durch eine flüssige API angeben.Beachten Sie auch, dass der Methodenname
[WithOptionalPrincipal()][1]
irgendwie ironisch ist. In diesem Fall ist Principal Bar. Die Beschreibung von WithOptionalDependent () auf msdn macht es klarer.quelle
PrimaryBarId
? Das ist lächerlich für mich. Wenn ich die Eigenschaft hinzufüge und sage, dass es sich um den Fremdschlüssel handelt, wird eine Fehlermeldung angezeigt. Aber wenn ich die Eigenschaft nicht habe, wird EF sie trotzdem erstellen. Was ist der Unterschied?PrimayBarId
Eigenschaft in einerFoo
Entität hatte. Wahrscheinlich die gleiche Lösung, die Sie versucht haben. Einschränkungen in EF vielleicht?