实体框架:模型包含一个包含三个项目的列表(导航属性),type=本身,给出错误.(可能是外键映射错误)

本文关键字:错误 框架 出错 本身 映射 type 列表 项目 包含三 模型 导航 | 更新日期: 2023-09-27 18:05:07

我的模型是这样的

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

    /*Users who are following current user*/
    public virtual ICollection<User> Followers { get; set; }
    /*Users whom current user is following*/
    public virtual ICollection<User> Following { get; set; }

    /*current user has ignored these users*/
    public virtual ICollection<User> Ignores { get; set; }
}

添加数据

        User john = new User { Name = "john" };
        User mary = new User { Name = "mary" };
        User david = new User { Name = "david" };
        john.Following = new List<User> { mary };
        mary.Followers = new List<User> { john};
        john.Ignores = new List<User> { david};
        context.Users.Add(john);
        context.Users.Add(mary);
        context.Users.Add(david);
        context.SaveChanges();

这样做会给出错误:

无法确定依赖操作的有效排序。依赖关系可能由于外键约束、模型需求或存储生成的值而存在。

如果我从User模型中删除属性Ignores,它的工作完美,但忽略它不。

我认为有一些映射需要做,请建议我怎么做!!

实体框架:模型包含一个包含三个项目的列表(导航属性),type=本身,给出错误.(可能是外键映射错误)

问题似乎是EF不知道哪两个是多对多,哪一个是一对多。您可以尝试显式地说明这些,而不是依赖于惯例。尝试重写DbContext类的OnModelCreating(DbModelBuilder)方法(如果您正在使用DbContext)。

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<User>()
        .HasMany(u => u.Ignores)
        .WithReequired()
        .HasForeignKey(u => u.ID);
    mb.Entity<User>()
        .HasMany(u => u.Followers)
        .WithMany(u => u.Following);
        // If you want to specify a table, use the following line:
        // .Map(m => m.ToTable("CustomManyToManyTableName");
}

注意:这是我的想法,所以不要依赖于我的语法和如此精确,但它应该非常接近。