2015-09-27 58 views
0

實體框架對此特定場景中的數據註釋更改沒有反應,所以我想嘗試通過Fluent API,這是我從不使用的。通過Fluent API創建EF外鍵

我有一個模型「Transfer」,它有三個屬性 - 它的Id和「TransferredFromId」和「TransferredToId」屬性,它們表示用戶(另一個EF模型)參與傳輸。像這樣:

public class Transfer 
{ 
    public long Id { get; set; } 

    public long TransferredFromId { get; set; } 
    [ForeignKey("TransferredFromId")] 
    public User TransferredFrom { get; set; } 

    public long TransferredToId { get; set; } 
    [ForeignKey("TransferredToId")] 
    public User TransferredTo { get; set; } 
} 

用戶模型目前看起來是這樣的:

public class User 
{ 
    public long Id { get; set; } 

    [InverseProperty("TransferredFrom")] 
    public ICollection<Transfer> TransferredFroms { get; set; } 

    [InverseProperty("TransferredTo")] 
    public ICollection<Transfer> TransferredTos { get; set; } 
} 

注 - 我認爲用戶可以這個樣子,它仍然能工作:

public class User 
{ 
    public long Id { get; set; } 
} 

我如何通過Fluent API實現完全相同的目標?

爲了澄清,我想有一個轉移表,它有兩個屬性,它們都代表Users表中的Id。


臨時編輯:當我切換到Fluent API時,我的模型應該是這樣嗎?

public class Transfer 
{ 
    public long Id { get; set; } 

    public long TransferredFromId { get; set; } 

    public long TransferredToId { get; set; } 
} 

public class User 
{ 
    public long Id { get; set; } 
} 

,然後在上下文中添加此?

 modelBuilder.Entity<Transfer>().HasRequired(x => x.TransferredFrom).WithMany(x => x.TransferredFroms).HasForeignKey(x => x.TransferredFromId); 
     modelBuilder.Entity<Transfer>().HasRequired(x => x.TransferredTo).WithMany(x => x.TransferredTos).HasForeignKey(x => x.TransferredToId); 

回答

2

兩種可能性,這取決於你想從哪一方開始。

首先,您必須重寫上下文中的OnModelCreating()方法。

兩個選擇應該是這樣的:

modelBuilder.Entity<Transfer>().HasRequired(x=>x.TransferredFrom).WithMany(x=>x.TransferredFroms).HasForeignKey(x=>x.TransferredFromId); 
modelBuilder.Entity<Transfer>().HasRequired(x=>x.TransferredTo).WithMany(x=>x.TransferredTos).HasForeignKey(x=>x.TransferredToId); 

modelBuilder.Entity<User>().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId); 
modelBuilder.Entity<User>().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId); 

這兩條線的每一組應該有相同的語義數據註解的映射。

+0

謝謝你的回答。我似乎理解第二種選擇,但不是第一種。在哪裏指向用戶表?另外,我應該在原始模型中留下什麼?我暫時編輯了我的問題來解釋我的意思。 – VSO

+0

您的導航屬性指向用戶表,即TransferredFrom,TransferredTo。你應該在模型中保留這些導航屬性,也是相反的。數據註釋可以被刪除。如果你想使用較少的導航屬性,你可以在用戶表中跳過一個,如果你刪除了兩個,那麼EF會對哪個導航屬性使用哪個鍵感到困惑(即使你正確配置) – DevilSuichiro

+0

非常感謝。/PL – VSO