使用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; }
}
这会成功生成表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; }
}
现在它不起作用。它会生成表,然后在尝试创建关系时抛出以下错误:
在表'BlogMeta'上引入FOREIGN KEY约束'BlogMeta_User'可能会导致循环或多个级联路径。
那么引入public int UserID
有什么好处?为什么这样做会失败呢?
修改 好的,所以我遇到了this answer,它概述了独立协会和外国关键协会之间的区别......事实证明这就是我所说的。所以这就留下了一个问题,为什么在使用外键关联时会抛出上述错误?
答案 0 :(得分: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);
}
如果您在WithMany(u => u.BlogMetas)
课程中定义了BlogMeta
的合并,则可以指明关系的另一端(User
)。