如何使用实体框架流畅的API配置多对多关系

Fix*_*xer 25 c# associations ef-code-first entity-framework-4.1

我试图首先在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; }
}
Run Code Online (Sandbox Code Playgroud)

一个帐户可以有许多产品.

但是,EF约定将创建DB表,如下所示:

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

Accounts Table
--------------
Id
Name
Run Code Online (Sandbox Code Playgroud)

这看起来不像是一个多对多的表结构?如何配置流畅的API以反映关系并创建中间表:

AccountProducts Table
---------------------
Account_Id
Product_Id
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 59

modelBuilder.Entity<Account>()
            .HasMany(a => a.Products)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("Account_Id");
                x.MapRightKey("Product_Id");
                x.ToTable("AccountProducts");
            });
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但只是在我在`.WithMany()`中添加了等效的`p => p.Accounts`之后.没有这样做,它在Accounts中创建了一个奇怪的属性. (4认同)
  • @Chris没有那个随机的评论,我随机阅读它,我会被卡住.谢谢! (2认同)

Nin*_*Nye 7

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; }
}
Run Code Online (Sandbox Code Playgroud)