2016-10-10 46 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

相关问题