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;}
}
Próbowałem to zrobić w Entity Framework, gdy otrzymałem błąd:
Nie można określić głównego końca powiązania między typami „ConsoleApplication5.Boo” i „ConsoleApplication5.Foo”. Główny koniec tego powiązania musi zostać jawnie skonfigurowany przy użyciu interfejsu API płynnego dla relacji lub adnotacji danych.
Widziałem pytania dotyczące StackOverflow z rozwiązaniem tego błędu, ale chcę zrozumieć, co oznacza termin „główny koniec”.
c#
entity-framework
database-design
foreign-key-relationship
taher chhabrawala
źródło
źródło
Odpowiedzi:
W relacji jeden do jednego jeden koniec musi być główny, a drugi koniec musi być zależny. Główny koniec to ten, który zostanie wstawiony jako pierwszy i który może istnieć bez zależnego. Koniec zależny to taki, który należy wstawić za zleceniodawcą, ponieważ ma on klucz obcy do zleceniodawcy.
W przypadku struktury jednostki FK zależna musi być również jej PK, więc w twoim przypadku powinieneś użyć:
Lub płynne mapowanie
źródło
Foo
jest to podstawa?Boo
jest zależny, wymaga aFoo
i dostaje klucz obcy.Foo
jest głównym i może istnieć bezBoo
.[Required]
Aby rozwiązać ten problem, możesz również użyć atrybutu adnotacji danych:Foo
jest wymagane dlaBoo
.źródło
Boo
właśnie pobrany z bazy danych, chyba że najpierw uruchomisz leniwe ładowanieFoo
właściwości. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
być więc wirtualny?Odnosi się to do odpowiedzi @Ladislav Mrnka na używanie płynnego interfejsu API do konfigurowania relacji jeden do jednego.
Miałem sytuację, w której posiadanie
FK of dependent must be it's PK
było niemożliwe.Np.
Foo
Ma już relację jeden do wieluBar
.Teraz musieliśmy dodać kolejną relację jeden do jednego między Foo i Barem.
Oto jak określić relację jeden do jednego za pomocą płynnego interfejsu API:
Pamiętaj, że podczas dodawania
PrimaryBarId
należy usunąć, ponieważ określamy go za pomocą płynnego interfejsu API.Zauważ też, że nazwa metody
[WithOptionalPrincipal()][1]
jest trochę ironiczna. W tym przypadku Zleceniodawcą jest Bar. Opis WithOptionalDependent () na msdn czyni go bardziej zrozumiałym.źródło
PrimaryBarId
nieruchomość? To jest dla mnie śmieszne. Jeśli dodam właściwość i stwierdzę, że jest to klucz obcy, pojawia się błąd. Ale jeśli nie mam tej właściwości, EF i tak ją utworzy. Co za różnica?PrimayBarId
właściwość w obiekcieFoo
. Prawdopodobnie to samo rozwiązanie, które wypróbowałeś. Być może ograniczenia w EF?