2016-10-10 66 views
2

我試圖在類的ApplicationUser和最近創建的一個叫做'Issue'之間創建'一對多'關係。ASP.NET MVC5 - 更新後創建的不需要的字段

所以,在型號/ IdentityModels.cs/ApplicationUser我加入這個屬性:

public ICollection<Issue> Issues { get; set; } 

而且Issue.cs有這樣的代碼:

namespace Test.Models 
{ 
    public class Issue 
    { 
     public int Id { get; set; } 
     public ApplicationUser Courier { get; set; } 
     public ApplicationUser Customer { get; set; } 
    } 
} 

我使用的是自動遷移。因此,構建和運行 '更新數據庫' 之後,問題表與這些領域的創建:

  1. 編號
  2. ApplicationUser_Id
  3. CourierId
  4. 客戶編號

我的問題是爲什麼字段'ApplicationUser_Id'創建了,我該如何防止它?

+0

什麼是添加的屬性的意圖是什麼?它應該包含什麼 - 用戶是「Courier」還是「Customer」的問題? –

+0

你使用Code First遷移模式嗎?可能需要在PK字段上設置「KeyAttribute」,以在執行遷移之前保留定義的主鍵並創建表關係。 –

回答

0

的問題是,EF認爲你真正想要三個一到多的問題和ApplicationUser之間的關係:(CourierId)

  • 一個ICollection<Issue> IssuesApplicationUser(ApplicationUser_Id)
  • 一個ApplicationUser CourierIssue
  • 一個用於ApplicationUser CustomerIssue(客戶ID)

(請注意,EF允許定義來自任何一方的關係。)

如果希望ApplicationUser.Issues包含此用戶的所有問題,不管他是快遞或客戶,則需要額外的ApplicationUser_Id關鍵。配置EF以便它起作用將是相當痛苦的。

也許一個更簡單的解決方案將做到:在ApplicationUser上引入兩個集合。

public ICollection<Issue> CourierIssues { get; set; } 
public ICollection<Issue> CustomerIssues { get; set; } 

,然後用流利的API,以消除ApplicationUser_Id鍵配置在模型構建器反向鏈接:

modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CourierIssues).WithOptional(i => i.Courier); 
modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CustomerIssues).WithOptional(i => i.Customer); 
+0

謝謝@Georg Patscheider – amendoins

0

因爲你有兩個外鍵ApplicationUserCourierCustomer,但只有一個收集參考IssueApplicationUser。 EF無法知道它應該與哪個外鍵對齊,所以它只是創建了一個新外鍵。要正確處理這個問題,你需要利用流利的配置:

public class ApplicationUser 
{ 
    ... 

    public class Mapping : EntityTypeConfiguration<ApplicationUser> 
    { 
     HasMany(m => m.Issues).WithRequired(m => m.Customer); 
    } 
} 

然後,在你的背景:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Configurations.Add(new ApplicationUser.Mapping()); 
} 

這裏的問題當然是,你可能想跟蹤這兩個集合CustomerCourier集合。對於這一點,你需要集合:

public virtual ICollection<Issue> CustomerIssues { get; set; } 
public virtual ICollection<Issue> CourierIssues { get; set; } 

接着,下面的流暢配置:

HasMany(m => m.CustomerIssues).WithRequired(m => m.Customer); 
HasMany(m => m.CourierIssues).WithRequired(m => m.Courier); 
+0

非常感謝您提供非常豐富的答案。 – amendoins