Fluent Mapping не работает на EF 4.1 с Code First

Вот простая модель:

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

Как вы можете видеть, Валюта - это просто список, который будет использоваться двумя различными объектами, но если я попытаюсь выполнить это, я получу сообщение об ошибке, в котором говорится, что это недопустимо, поскольку это может привести к нескольким каскадным путям.

Теперь я пытаюсь понять, как смоделировать это на 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);
}

Но по какой-то причине, хотя продукт создан правильно, всякий раз, когда я пытаюсь загрузить его, Валюта приходит в ноль.

Что я делаю не так в этом моделировании?

Спасибо!

2 ответа

Я понял это, и я объясню здесь для дальнейшего использования: после лучшего просмотра созданной базы я понял, что это создает FK для неправильного поля: P1:ID -> Currency:ID, когда правильным должно быть P1:CurrencyID -> Валюта: ID

Итак, я нашел способ заставить правильный FK:

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

И это все!

Карта ваших классов, как это:

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

Другие вопросы по тегам