我正在尝试在类“ ApplicationUser”和最近创建的一个名为“问题”的类之间创建“一对多”关系。

因此,在Models / 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; }
    }
}


我正在使用自动迁移。因此,在构建并运行“ update-database”之后,使用以下字段创建了Issues表:


ID
ApplicationUser_Id
CourierId
客户ID


我的问题是为什么创建了“ ApplicationUser_Id”字段,我该如何防止呢?

最佳答案

问题在于,EF认为您实际上需要在Issue和ApplicationUser之间建立三个一对多的关系:


一个用于ICollection<Issue> Issues上的ApplicationUser(ApplicationUser_Id)
一个用于ApplicationUser Courier上的Issue(CourierId)
一个用于ApplicationUser Customer上的Issue(CustomerId)


(请注意,EF允许从双方定义关系。)

如果希望ApplicationUser.Issues包含此用户的所有问题,无论他是快递员还是客户,都将需要其他ApplicationUser_Id密钥。配置EF使其工作相当麻烦。

也许会有一个更简单的解决方案:在ApplicationUser上引入两个集合。

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


然后使用流畅的API在ModelBuilder中配置反向链接,以消除ApplicationUser_Id键:

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

关于c# - ASP.NET MVC5-更新数据库后创建了不需要的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39961494/

10-09 03:42