ASP.NET MVC5 - 更新数据库

时间:2016-10-10 15:15:34

标签: c# asp.net-mvc entity-framework

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

所以,在 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”之后,使用以下字段创建了问题表

  1. Id
  2. ApplicationUser_Id
  3. CourierId
  4. 客户ID
  5. 我的问题是为什么“ApplicationUser_Id”字段已创建,我该如何阻止它呢?

2 个答案:

答案 0 :(得分:0)

问题是EF认为你实际上想要在Issue和ApplicationUser之间建立三对一关系:

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

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

如果您希望ApplicationUser.Issues包含此用户的所有问题,无论他是Courier还是客户,您都需要额外的 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);

答案 1 :(得分:0)

因为ApplicationUserCourierCustomer有两个外键,但Issue上只有一个引用ApplicationUser的集合。 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);