私は最初に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; }
}
1つのアカウントに多数の製品を含めることができます。
ただし、EFの規則により、DBテーブルは次のように作成されます。
Products Table
--------------
Id
Name
Account_Id <- What is this?
Accounts Table
--------------
Id
Name
これは多対多のテーブル構造のように見えませんか?関係を反映して中間テーブルを作成するようにFluent APIを構成するにはどうすればよいですか?
AccountProducts Table
---------------------
Account_Id
Product_Id
modelBuilder.Entity<Account>()
.HasMany(a => a.Products)
.WithMany()
.Map(x =>
{
x.MapLeftKey("Account_Id");
x.MapRightKey("Product_Id");
x.ToTable("AccountProducts");
});
EFが提案したのは、1対多の関係です。
1つのアカウントに多数の製品を含めることができます。つまり、各製品には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; }
}
最初のコードは、正しいリレーショナルな方法でテーブルを作成することです。いつ
1つのアカウントに複数の製品を含めることができます。
Productsテーブルは、実際に行うように、アカウントのキーを格納する必要があります。
Dbで確認しようとしているのは、多対多の関係であり、1対多ではありません。最初にコードでそれを実現したい場合は、エンティティを再設計する必要があります
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; }
}
この場合、1つの製品に多数のアカウントを含めることができ、1つのアカウントに多数の製品を含めることができます。
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"));
}