我试图先在现有表上使用代码定义两个表之间的多对多关系。无法修改“状态”表和类,因此我试图找到一种无需修改表或类即可在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
的联接表,其中包含ContentID
和StateID
作为两列。
在我的数据上下文类中,我想使用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行。
如何配置它以与构造的联接表配合使用?
答案 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");
});