Страницы

Поиск по вопросам

воскресенье, 26 мая 2019 г.

Entity Framework. Несколько связей многие ко многим между двумя таблицами

Используется Code First.
Есть модели Productи User. Пользователь может иметь много продуктов купленных онлайн и много купленных оффлайн. В то же время у продукта есть список пользователей, которые приобрели онлайн и список оффлайн соответственно.
Получается мы имеем 2 связи многие ко многим. Как реализовать это в классах моделей?
public class Product { public int Id { get; set; } public int Price { get; set; }
public virtual ICollection OnlineCustomers { 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?


Ответ

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

Комментариев нет:

Отправить комментарий