实体框架中的外键 - 循环或多个级联路径错误

Mic*_*ott 3 entity-framework foreign-keys ef-code-first

使用EF Code First我有以下内容,例如:

public class Blog
{
    public int BlogID { get; set; }
    public string Content { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<BlogMeta> BlogMeta { get; set; }
}

public class BlogMeta
{
    public int BlogMetaID { get; set; }
    public string Content { get; set; }
    public virtual User User { get; set; }
    public virtual Blog Blog { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这将成功生成表Blog和BlogMeta,并与User表创建外键关系.阅读本文后,我将其更改为以下内容:

public class Blog
{
    public int BlogID { get; set; }
    public string Content { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<BlogMeta> BlogMeta { get; set; }
}

public class BlogMeta
{
    public int BlogMetaID { get; set; }
    public string Content { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public int BlogID { get; set; }
    public virtual Blog Blog { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在它不起作用.它会生成表,然后在尝试创建关系时抛出以下错误:

在表'BlogMeta'上引入FOREIGN KEY约束'BlogMeta_User'可能会导致循环或多个级联路径.

那么介绍public int UserID它的优势是什么呢?为什么这样做会失败呢?

编辑: 好的,所以我遇到了这个答案,概述了独立协会和外国关键协会之间的区别......事实证明这就是我所说的.所以这就留下了一个问题,为什么在使用外键关联时会抛出上述错误?

Kam*_*yar 7

正如Ladislav所提到的,您正在为BlogMeta实体定义多个级联路径.你必须为你的一个关系禁用级联.

您可以将以下方法添加到上下文类中,以便为User-BlogMeta关系进行diable级联:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<BlogMeta>().HasRequired(bm => bm.User).WithMany().WillCascadeOnDelete(false);
    base.OnModelCreating(modelBuilder);
}  
Run Code Online (Sandbox Code Playgroud)

WithMany(u => u.BlogMetas)如果您已BlogMetaUser班级中定义了一个集合,则可以指示relationship()的另一端.