C# ASP.NET MVC5-更新数据库后创建的不需要的字段
我试图在“ApplicationUser”类和最近创建的“Issue”类之间创建一个“一对多”关系 因此,在Models/IdentityModels.cs/ApplicationUser中,我添加了以下属性:C# ASP.NET MVC5-更新数据库后创建的不需要的字段,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我试图在“ApplicationUser”类和最近创建的“Issue”类之间创建一个“一对多”关系 因此,在Models/IdentityModels.cs/ApplicationUser中,我添加了以下属性: public ICollection<Issue> Issues { get; set; } 我正在使用自动迁移。因此,在构建并运行“更新数据库”后,使用以下字段创建了问题表: 身份证 应用程序用户Id 信使 客户ID 我的问题是为什么要创建“ApplicationUser
public ICollection<Issue> Issues { get; set; }
我正在使用自动迁移。因此,在构建并运行“更新数据库”后,使用以下字段创建了问题表:
我的问题是为什么要创建“ApplicationUser_Id”字段以及如何防止它?问题是EF认为您实际上需要问题和ApplicationUser之间的三个一对多关系:
- 一个用于
(ApplicationUser\u Id)上的ApplicationUser
i收集问题
- 一个用于
发行的
(CourierId)应用程序用户快递
- 一个用于
问题的
应用程序用户客户
(客户ID)
ApplicationUser.Issues
包含此用户的所有问题,无论他是快递员还是客户,您将需要额外的ApplicationUser\u Id密钥。配置EF以使其正常工作将是一件非常痛苦的事情
也许一个更简单的解决方案可以做到:在ApplicationUser
上引入两个集合
public ICollection<Issue> CourierIssues { get; set; }
public ICollection<Issue> CustomerIssues { get; set; }
公共ICollection信使{get;set;}
公共ICollection客户问题{get;set;}
然后使用fluent API在ModelBuilder中配置反向链接,以消除应用程序用户Id键:
modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CourierIssues).WithOptional(i => i.Courier);
modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CustomerIssues).WithOptional(i => i.Customer);
modelBuilder.Entity();
modelBuilder.Entity().HasMany(au=>au.CustomerIssues)。带可选(i=>i.Customer);
因为您有两个外键,分别指向ApplicationUser
、Courier
和Customer
,但只有一个集合引用问题。EF无法知道它应该与哪个外键对齐,所以它只是创建了一个新的外键。要正确处理此问题,您需要使用fluent配置:
public class ApplicationUser
{
...
public class Mapping : EntityTypeConfiguration<ApplicationUser>
{
HasMany(m => m.Issues).WithRequired(m => m.Customer);
}
}
HasMany(m => m.CustomerIssues).WithRequired(m => m.Customer);
HasMany(m => m.CourierIssues).WithRequired(m => m.Courier);
当然,这里的问题是,您可能希望跟踪客户
和快递公司
的收款情况。为此,您需要两个集合:
public virtual ICollection<Issue> CustomerIssues { get; set; }
public virtual ICollection<Issue> CourierIssues { get; set; }
新增财产的目的是什么?它应该包含的内容-用户是信使
还是客户
的问题?您是否使用了代码优先迁移模式?在执行迁移之前,可能需要在PK字段上设置KeyAttribute
,以保留已定义的主键并创建表关系。
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);