Как настроить отношение многих ко многим, используя API-интерфейс сущностей
Сначала я пытаюсь установить отношение многих ко многим в EF-коде, но соглашения по умолчанию ошибочны. Следующие классы описывают взаимосвязь:
class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
class Account
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
У одной учетной записи может быть много продуктов.
Однако соглашения EF будут создавать таблицы DB как:
Products Table
--------------
Id
Name
Account_Id <- What is this?
Accounts Table
--------------
Id
Name
Это не похоже на структуру таблицы "многие-ко-многим"? Как я могу настроить свободный API для отражения отношений и создания промежуточной таблицы:
AccountProducts Table
---------------------
Account_Id
Product_Id
Ответы
Ответ 1
modelBuilder.Entity<Account>()
.HasMany(a => a.Products)
.WithMany()
.Map(x =>
{
x.MapLeftKey("Account_Id");
x.MapRightKey("Product_Id");
x.ToTable("AccountProducts");
});
Ответ 2
Что предложил EF, это отношение "один ко многим".
У одной учетной записи может быть множество Продуктов, то есть каждый Продукт имеет Account_Id
Если вам нужно отношение много-много (и создать промежуточную таблицу), то следует работать
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
}
class Account
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Ответ 3
Сначала код создает таблицы в правильном реляционном режиме. Когда
У одной учетной записи может быть много продуктов.
Таблица продуктов должна хранить ключ для своей учетной записи, как это сейчас происходит.
То, что вы пытаетесь увидеть в db, - это отношения "многие ко многим", а не одно. Если вы хотите добиться этого с помощью кода сначала, вы должны перепроектировать свои объекты
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
}
class Account
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
В этом случае один продукт может иметь много учетных записей, а одна учетная запись может иметь много продуктов.
Ответ 4
public AccountProductsMap()
{
this.ToTable("AccountProducts");
this.HasKey(cr => cr.Id);
this.HasMany(cr => cr.Account)
.WithMany(c => c.Products)
.Map(m => m.ToTable("AccountProducts_Mapping"));
}