使用Code First在EF 4.1上出现Fluent映射错误

时间:2012-05-08 20:08:14

标签: entity-framework ef-code-first fluentvalidation entity-framework-mapping

这是一个简单的模型:

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都会为空。

我在这个建模中做错了什么?

谢谢!

2 个答案:

答案 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; }

请参阅以下链接以获取更多信息:

http://msdn.microsoft.com/en-us/data/jj591617.aspx

http://entityframework.codeplex.com/workitem/1049