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表,其中包含以下字段:
- Id
- ApplicationUser_Id
- CourierId
- CustomerId
我的问题是为什么字段'ApplicationUser_Id '创建,我怎么能防止它?
问题是EF认为您实际上需要Issue和ApplicationUser之间的三个一对多关系:
-
ICollection<Issue> Issues
onApplicationUser
(ApplicationUser_Id) -
ApplicationUser Courier
onIssue
1 (CourierId) -
ApplicationUser Customer
在Issue
上的一个(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
, Courier
和Customer
的外键,但是在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());
}
这里的问题当然是,您可能希望同时跟踪Customer
和Courier
集合的集合。为此,需要两个集合:
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);