我正在尝试在“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”之后,使用以下字段创建了问题表:
我的问题是为什么“ApplicationUser_Id”字段已创建,我该如何阻止它呢?
答案 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)
因为ApplicationUser
,Courier
和Customer
有两个外键,但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());
}
当然,问题在于您可能希望跟踪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);