如何通过Fluent API Entity Framework定义多对多关系?

20 浏览
0 Comments

如何通过Fluent API Entity Framework定义多对多关系?

以下是我的模型:

public class TMUrl
{
    //许多其他属性
    //只有一个属性的类型为Keyword
    public List Keywords{get;set;} 
}
public class Keyword
{
   //许多其他属性
   //只有一个属性的类型为TMUrl
   public List Urls{get;set;}
}

很明显,这两个实体之间存在多对多的关系。

我选择使用流畅的API来告诉实体框架这种关系,即:

modelBuilder.Entity
               .HasMany(s => s.Keywords)
               .WithMany(s => s.URLs).Map(s =>
                {
                    s.MapLeftKey("KeywordId");
                    s.MapRightKey("UrlId");
                    s.ToTable("KeywordUrlMapping");
                });

但是当我执行以下操作时:

url.Keywords.Add(dbKey); //其中url是TMUrl对象,dbKey是一个现有/新的Keyword对象
db.SaveChanges();

我得到了异常:

在保存不公开其关系的外键属性的实体时发生错误....

内部异常:

INSERT 语句与 FOREIGN KEY 约束“KeywordMaster_Keyword”冲突,冲突发生在数据库“DbName”、表“dbo.KeywordMaster”、列“Id”上。该语句已终止。

但是当我同时从另一侧添加配置时,一切正常运行。

即:

modelBuilder.Entity
         .HasMany(s => s.URLs)
         .WithMany(s => s.Keywords)
         .Map(s =>
               {
                  s.MapLeftKey("KeywordId");
                  s.MapRightKey("UrlId");
                  s.ToTable("KeywordUrlMapping");
               });

为什么?为什么我必须从两个实体中都添加配置,我在这里和其他许多地方读到,只需要为其中一个实体添加配置。

什么情况下,我应该为参与关系的两个实体都添加配置?

我需要理解这个。为什么。请帮助。

0