配置实体框架两个表之间的多对多关系?

时间:2018-10-10 21:27:44

标签: c# entity-framework entity-framework-6

我试图先在现有表上使用代码定义两个表之间的多对多关系。无法修改“状态”表和类,因此我试图找到一种无需修改表或类即可在Entity Framework中使该关系正常工作的方法。

我在SQL中有一个由类表示的表:

 [Table("MySchema.Content")]
public class Content 
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public virtual ICollection<State> States { get; set; }
}

我还有第二张表,代表国家清单。 (该类和表不能更改) 该类是:

[Table("dbo.State")]
public class State
{
    public int StateID { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
}

我手动创建了一个名为MySchema.Content_State的联接表,其中包含ContentIDStateID作为两列。

在我的数据上下文类中,我想使用ModelBuilder来创建关系,但是还无法弄清楚如何使其起作用。

在上下文中,我尝试了以下操作:

 modelBuilder.Entity<Content>()
           .HasMany<State>(a => a.States)
           .WithMany(a => a.Contents)
           .Map(a =>
           {
               a.ToTable("Content_State", "MySchema");
               a.MapLeftKey("ContentId");
               a.MapRightKey("StateID");
           });

以上内容无法编译,抱怨WithMany行。

如何配置它以与构造的联接表配合使用?

2 个答案:

答案 0 :(得分:1)

您的模型

  [Table("MySchema.Content")]
public class Content
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public ICollection<ContentState> ContentStates { get; set; }

}

[Table("dbo.State")]
public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
    public ICollection<ContentState> ContentStates { get; set; }

}

public class ContentState
{
    public int ContentId { get; set; }
    public int StateId { get; set; }
    public Content Content { get; set; }
    public State State { get; set; }
}

您的映射

      protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                 modelBuilder.Entity<ContentState>()
            .HasKey(bc => new { bc.StateId, bc.ContentId });


        modelBuilder.Entity<ContentState>()
            .HasOne(bc => bc.Content)
            .WithMany(b => b.ContentStates)
            .HasForeignKey(bc => bc.ContentId);


        modelBuilder.Entity<ContentState>()
            .HasOne(bc => bc.State)
            .WithMany(c => c.ContentStates)
            .HasForeignKey(bc => bc.StateId);
            }

答案 1 :(得分:0)

在上下文中,我只是将代码更改为:

modelBuilder.Entity<Content>()
       .HasMany<State>(a => a.States)
       .WithMany()
       .Map(a =>
       {
           a.ToTable("Content_State", "MySchema");
           a.MapLeftKey("ContentId");
           a.MapRightKey("StateID");
       });