web-dev-qa-db-ja.com

Entity Framework Fluent 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; }
}

1つのアカウントに多数の製品を含めることができます。

ただし、EFの規則により、DBテーブルは次のように作成されます。

Products Table
--------------
Id
Name
Account_Id  <- What is this?

Accounts Table
--------------
Id
Name

これは多対多のテーブル構造のように見えませんか?関係を反映して中間テーブルを作成するようにFluent APIを構成するにはどうすればよいですか?

AccountProducts Table
---------------------
Account_Id
Product_Id
25
Fixer
modelBuilder.Entity<Account>()
            .HasMany(a => a.Products)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("Account_Id");
                x.MapRightKey("Product_Id");
                x.ToTable("AccountProducts");
            });
59
Slauma

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; }
}
7
NinjaNye

最初のコードは、正しいリレーショナルな方法でテーブルを作成することです。いつ

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つのアカウントに多数の製品を含めることができます。

2
archil
        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"));
    }
1
andre