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; }
см. эти ссылки для получения дополнительной информации: