这是一个简单的模型:
public class Product1
{
public int Id { get; set; }
public double Price { get; set; }
public int CurrencyID { get; set; }
public Currency Currency { get; set; }
}
public class Product2
{
public int Id { get; set; }
public double Price { get; set; }
public int CurrencyID { get; set; }
public Currency Currency { get; set; }
}
public class Currency
{
public int Id { get; set; }
public string Name { get; set; }
public string ISO4217 { get; set; }
public string Symbol { get; set; }
}
正如您所看到的,Currency只是一个将由两个不同实体使用的列表,但是如果我尝试运行它,它会给我一个错误,说明这是无效的,因为它可能导致多个级联路径。 / p>
现在我试图想出如何在OnModelCreating上建模
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product1>().HasRequired(p => p.Currency).WithMany().WillCascadeOnDelete(false);
modelBuilder.Entity<Product2>().HasRequired(p => p.Currency).WithMany().WillCascadeOnDelete(false);
}
但由于某种原因,虽然产品已正确创建,但每当我尝试加载它时,Currency都会为空。
我在这个建模中做错了什么?
谢谢!
答案 0 :(得分:1)
我想出来了,我将在此解释以备将来参考:在更好地查看创建的基础之后,我意识到它正在为错误的字段创建FK:P1:ID - &gt;货币:ID,正确时应为P1:CurrencyID - &gt;货币:ID
所以我找到了强制正确FK的方法:
modelBuilder.Entity<Product1>().HasRequired(p => p.Currency).WithMany().HasForeignKey(p => p.CurrencyId);
就是这样!
答案 1 :(得分:0)
映射你这样的课程:
public class Product1Mapping : EntityTypeConfiguration<Product1>
{
public Product1Mapping ()
{
ToTable("Product1");
HasKey(p => p.Id);
HasRequired(p => p.Tag).WithMany().HasForeignKey(t => t.CurrencyID);
}
}
public class Product2Mapping : EntityTypeConfiguration<Product2>
{
public Product2Mapping ()
{
ToTable("Product2");
HasKey(p => p.Id);
HasRequired(p => p.Tag).WithMany().HasForeignKey(t => t.CurrencyID);
//other properties
}
}
并更改OnModelCreating创建方法,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new AccountMapping());
// Add other mapping classes
}
public DbSet<Product1> Product1{ get; set; }
public DbSet<Product2> Product2{ get; set; }
请参阅以下链接以获取更多信息: