1

这里有一个简单的模型:

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 只是一个列表,将由两个不同的实体使用,但如果我尝试运行它,它会给我一个错误,说这是无效的,因为可能导致多个级联路径。

现在我想弄清楚如何在 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);
}

但是由于某种原因,尽管产品已正确创建,但每当我尝试加载它时,货币都会变为空。

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

谢谢!

4

2 回答 2

1

我想通了,我将在这里解释以供将来参考:在更好地查看创建的基础后,我意识到它正在为错误的字段创建 FK:P1:ID -> Currency:ID,而正确的应该是 P1:CurrencyID -> 货币:ID

所以我找到了一种强制正确FK的方法:

modelBuilder.Entity<Product1>().HasRequired(p => p.Currency).WithMany().HasForeignKey(p => p.CurrencyId);

就这样!

于 2012-05-09T13:17:17.950 回答
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

于 2014-02-03T21:49:46.853 回答