2013-10-14 11 views
29

Ich habe eine Klasse AgentBalance mit einem Verband an den Agenten, so festgelegt wird:EF-Code Erste Fluent API der Fremdschlüsseleigenschaft

public class AgentBalance 
{ 
    ... 

    public int AgentId { get; set; } 

    public virtual Agent Agent { get; set; } 

} 

AgentID erfasst wird als FK für den Agent-Beziehung durch Konvention, aber ich möchte Machen Sie es in der Mapping-Klasse explizit, um sicher gegen zukünftige Änderungen zu sein. Wenn der Agent eine Sammlung von Guthaben hatte dann weiß ich, wie dieses beispiel zu tun .:

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

jedoch -Agent nicht eine Sammlung von Waagen hat - ich will nicht, dass Verein befahrbar sein Gegenteil. Aber ohne die .WithMany im Mapping bekomme ich nicht die Möglichkeit, .HasForeignKey zu spezifizieren. Gibt es eine andere Art und Weise? (N.B. Ich weiß, ich könnte dies auch mit Attributen tun, aber ich möchte das flüssige API-Mapping verwenden).

Antwort

48

Ich glaube, Sie sollten in der Lage sein, dies zu tun:

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

Danke - ich verpasst hatte, dass WithMany() überlastet war! Trotzdem scheint eine seltsame Syntax. Ich sehe nicht, warum sie dich nicht schreiben lassen könnten wie: HasRequired (t => t.Agent) .HasForeignKey (t => t.AgentId) –

+1

Es gäbe keinen Weg für EF zu wissen, welcher Typ der Beziehung ist es. – SOfanatic

+2

Das funktioniert nicht für mich. EF erstellt eine neue Agent_Id-Spalte neben meiner AgentId, die ich explizit als Fremdschlüsselspalte konfiguriert habe. Weißt du, warum das passiert? – Yulian

1

Ich ziehe Daten Anmerkungen für diese Aufgaben zu verwenden, nicht Fluent API. Es ist viel kürzer und leicht zu verstehen. EF muss Eigenschaften erkennen endete mit „Id“ automatisch, sondern auf einer sicheren Seite zu sein, das Sie sie explizit angeben:

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

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

Sie müssen sie explizit angeben, wenn Ihr FK prop nicht mit „Id“ beendet werden zum Beispiel:

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; } 

können Sie weitere Informationen finden Sie hier: https://msdn.microsoft.com/en-us/data/jj591583.aspx

+9

Datenanmerkungen sind, ich stimme zu, einfacher zu lesen. Aber es ist nicht, IMO, eine gute Möglichkeit, Dinge in einem sehr komplexen Projekt zu verwalten, das ist mein Kontext. –

+0

@RichardPawson warum nicht? – gsharp

+1

@gsharp ist, weil DataAnnotations nicht so leistungsfähig wie Fluent API ist, so dass Sie in einem großen Projekt immer Fluent API verwenden müssen, da DataAnnotations nicht ausreicht und wenn das passiert, endet die Konfiguration an zwei Stellen und es ist besser um die gesamte Konfiguration für ein Modell an einem Ort zu haben. – SOfanatic

Verwandte Themen