2013-10-14 4 views
29

Mam klasy AgentBalance ze stowarzyszenia do agenta, a więc:Kod EF Pierwsza Fluent API określając Foreign właściwości klucza

public class AgentBalance 
{ 
    ... 

    public int AgentId { get; set; } 

    public virtual Agent Agent { get; set; } 

} 

AgentId jest wykrywany jako FK dla relacji agent przez konwencję, ale chcę wyraź w klasie Mapping, aby była bezpieczniejsza od przyszłych zmian. Jeśli agent miał kolekcję sald wtedy wiem, jak to zrobić, np .:

HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId); 

Jednak agent nie posiada kolekcji sald - nie chcę, że stowarzyszenie będzie odwrotna żeglowna. Ale bez .WithMany w mapowaniu nie otrzymam opcji określenia .HasForeignKey. Czy istnieje inny sposób? (N.B. Wiem, że mógłbym to zrobić również za pomocą atrybutów, ale chcę używać płynnego mapowania API).

Odpowiedz

48

wierzę, powinieneś być w stanie to zrobić:

HasRequired(t => t.Agent).WithMany().HasForeignKey(t => t.AgentId) 
+6

Dzięki - ja ominęło że WithMany() została przeciążona! Nadal wydaje się dziwną składnią. Nie rozumiem, dlaczego nie mogliby napisać coś takiego: HasRequired (t => t.Agent) .HasForeignKey (t => t.AgentId) –

+1

Nie byłoby sposobu, aby EF wiedział, jaki typ związku to jest. – SOfanatic

+2

To nie działa dla mnie. EF tworzy nową kolumnę Agent_Id, poza moim AgentId, który jawnie skonfigurowałem jako kolumnę klucza obcego. Czy wiesz, dlaczego tak się dzieje? – Yulian

1

wolę używać danych adnotacje do tych zadań, a nie Fluent API. O wiele krótszy koniec jest łatwy do zrozumienia. EF musi wykryć właściwości zakończyła się „id” automatycznie, ale być na bezpiecznej stronie można określić je wyraźnie:

using System.ComponentModel.DataAnnotations.Schema; 
... 
public int AgentId { get; set; } 

[ForeignKey("AgentId")] 
public virtual Agent Agent { get; set; } 

Musisz określić je wyraźnie, jeśli prop FK nie zakończyła się „id” na przykład:

public int AgentCode { get; set; } 

[ForeignKey("AgentCode")] // now this is needed if you'd like to have FK created 
public virtual Agent Agent { get; set; } 

można znaleźć więcej szczegółów tutaj: https://msdn.microsoft.com/en-us/data/jj591583.aspx

+9

Adnotacje danych to, zgadzam się, łatwiejsze do odczytania. Ale to nie jest IMO, dobry sposób na zarządzanie rzeczami na bardzo złożonym projekcie na dużą skalę, który jest moim kontekstem. –

+0

@RichardPawson czemu nie? – gsharp

+1

@ gsharp to dlatego, że DataAnnotations nie jest tak potężny jak Fluent API, więc w dużym projekcie zawsze będziesz musiał używać Fluent API, ponieważ DataAnnotations nie wystarczą, a kiedy to się stanie, skończysz z konfiguracją w dwóch miejscach i to jest lepsze po prostu mieć całą konfigurację dla modelu w jednym miejscu. – SOfanatic