Страницы

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

воскресенье, 8 марта 2020 г.

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

#c_sharp #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?
    


Ответы

Ответ 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

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

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