首先使用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; }
}

现在不起作用。它生成表,然后在尝试创建关系时引发以下错误:

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

那么引入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);
}

如果您在WithMany(u => u.BlogMetas)类中定义了BlogMeta的集合,则可以指示关系的另一端(User)。

10-06 07:17