2012-08-22 13 views
5

Mam kilka klas domeny, które wyglądają mniej więcej tak, że chcę modelować z Code First (w EF 4.3).Dlaczego klasy Code First wymagają właściwości nawigacyjnych?

public class Foo { 
    // ... 
} 

public class Bar { 
    // ... 

    public Foo Foo { get; set; } 
} 

public class Baz { 
    // ... 

    public Foo Foo { get; set; } 
} 

W każdym example widzę jednak, obcy przedmiot odniesienia są dodawane w klasie Foo. Czy moja klasa Foo może być agnostyczna dla klasy Bar i Baz, czy naprawdę muszę coś takiego zrobić?

public class Foo { 
    // ... 
    public virtual Bar { get; set; } 

    public virtual Baz { get; set; } 
} 

Według this answer zajęcia zrobić potrzebę posiadania właściwości nawigacyjnych. Jestem nowy w Code First, więc czy ktoś może wyjaśnić, dlaczego tak się dzieje? Czy istnieje sposób na uniknięcie zanieczyszczania mojej klasy Foo w ten sposób za pomocą Fluent API?

Wydaje mi się dziwne, że Foo powinien wiedzieć o każdej klasie, która z niego korzysta. Czy mój projekt jest po prostu w jakiś sposób wadliwy?

Odpowiedz

1

Inna odpowiedź jest częściowo poprawna.

Jeśli chcesz code-Forst bootstrap model bazy danych z relacji między tabelami musisz zdefiniować w jednej klasie nieruchomości nawigacja przynajmniej.

Mapowanie będzie oczywiście działać również bez relacji, ale nie będzie ograniczeń na poziomie bazy danych/sql. Chyba że dodasz je za pomocą migracji lub innych skryptów sql.

Chociaż w waszym przykładzie nie jestem do końca pewien, jaki rodzaj związku próbujesz w jakikolwiek sposób zdefiniować. Czy to ma być relacja jeden-do-jednego?

w tym przypadku, Foo nie muszą wiedzieć o każdej innej klasy, który ma odniesienie do niego, jak odpowiedział połączonego pytanie tylko jeden klasa musi ją mieć.

+0

Dzięki, to wyjaśnić mój nieporozumienie. Pośpiesznie zinterpretowałem inną odpowiedź, mówiąc, że 'Foo' musi mieć właściwość nawigacji. – Eric

2

Twój problem tutaj będzie wymagał relacji jeden do jednego. Relacja jeden-do-jednego w EF jest odwzorowywana za pomocą kluczy podstawowych. Wybierasz główną jednostkę, a podmiot zależny musi mieć FK na swoim PK - muszą mieć przypisaną tę samą wartość PK. Przyczyną jest brak obsługi unikalnych kluczy.

Po zaakceptowaniu tego ograniczenia można po prostu wykorzystać swój model i map to lubią:

modelBuilder.Entity<Bar>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 

modelBuilder.Entity<Baz>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 
+0

To bardzo przydatne, dzięki. – Eric

Powiązane problemy