ASP.更新数据库后创建的不需要的字段

本文关键字:不需要 字段 创建 更新 数据库 ASP | 更新日期: 2023-09-27 18:12:18

我试图在类'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'之后,创建了Issues表,其中包含以下字段:

  1. Id
  2. ApplicationUser_Id
  3. CourierId
  4. CustomerId

我的问题是为什么字段'ApplicationUser_Id '创建,我怎么能防止它?

ASP.更新数据库后创建的不需要的字段

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

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

(注意EF允许从两边定义关系)

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

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

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

然后使用fluent 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);

因为您有两个指向ApplicationUser, CourierCustomer的外键,但是在ApplicationUser上只有一个引用Issue的集合。EF无法知道它应该与哪个外键对齐,所以它只是创建了一个新的外键。要正确处理这个问题,你需要使用fluent config:

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);