首先使用 EF 代码我有以下内容,例如:
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; }
}
这成功生成了表 Blog 和 BlogMeta 并创建了与 User 表的外键关系。看完this我将其更改为以下内容:
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; }
}
现在不行了。它生成表,然后在尝试创建关系时抛出以下错误:
Introducing FOREIGN KEY constraint 'BlogMeta_User' on table 'BlogMeta' may cause cycles or multiple cascade paths.
那么引入public int UserID
有什么好处,为什么会失败呢?
编辑: 好的,所以我遇到了this answer它概述了独立关联和外键关联之间的区别......事实证明这就是我在说的。那么这就留下了一个问题,为什么在使用外键关联的时候会抛出上面的错误呢?
最佳答案
正如 Ladislav 提到的,您正在为 BlogMeta
实体定义多个级联路径。您必须为您的一种关系禁用级联。
您可以将以下方法添加到上下文类中,以禁用 User-BlogMeta 关系的级联:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogMeta>().HasRequired(bm => bm.User).WithMany().WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
如果您在 User 中定义了
类。BlogMeta
的集合,则可以指示关系的另一端 (WithMany(u => u.BlogMetas)
)
关于entity-framework - Entity Framework 中的外键 - 循环或多级联路径错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946793/