#c_sharp #entity_framework
Используется Code First. Есть модели Productи User. Пользователь может иметь много продуктов купленных онлайн и много купленных оффлайн. В то же время у продукта есть список пользователей, которые приобрели онлайн и список оффлайн соответственно. Получается мы имеем 2 связи многие ко многим. Как реализовать это в классах моделей? public class Product { public int Id { get; set; } public int Price { get; set; } public virtual ICollectionOnlineCustomers { get; set; } public virtual ICollection OfflineCustomers { get; set; } } public class User { public int Id { get; set; } public string Name { get; set; } public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } } Насколько знаю, при связи многие ко многим EF автоматически создает третью таблицу, именуя ее ProductUsers. Но если связи две, как будут именоваться дополнительные таблицы? И как можно изменить правило именования промежуточных таблиц, каким атрибутом или Fluent API?
Ответы
Ответ 1
Fluent API protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(q => q.OnlineCustomers) .WithMany(q => q.OnlinePurchases) .Map(q => { q.ToTable("OnlineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); }); modelBuilder.Entity () .HasMany(q => q.OfflineCustomers) .WithMany(q => q.OfflinePurchases) .Map(q => { q.ToTable("OfflineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); }); } Всего будет 4 таблицы: Product, User, OnlineProductUsers, OfflineProductUsers Data Annotations public class Product { public int Id { get; set; } public int Price { get; set; } [InverseProperty("OnlinePurchases")] public virtual ICollection OnlineCustomers { get; set; } [InverseProperty("OfflinePurchases")] public virtual ICollection OfflineCustomers { get; set; } } public class User { public int Id { get; set; } public string Name { get; set; } public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } } Недостаток в том, что EF сам придумает названия новым таблицам Всего будет 4 таблицы: Product, User, ProductUsers, ProductUser1
Комментариев нет:
Отправить комментарий