消息关闭
    暂无新消息!

EF灵异现象,无法理解,求解惑

问题作者 : 康复xme2017-07-21发布
本人正常尝试开发一套流程图的数据

其中一个数据实体是 节点,其中有2个属性,一个是入口集合,一个是出口集合,理解上都是一对多,所以配置如下


public class Process
{
        public Guid Id { get; set; }

        public string Name { get; set; }

        public int Num { get; set; }

        public virtual List<Process> Incomings { get; set; }

        public virtual List<Process> Outgoings { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<Process>().HasMany(o => o.Incomings);
        modelBuilder.Entity<Process>().HasMany(o => o.Outgoings);
}



然后我尝试添加了几个节点


using (BpmnDbContext db = new BpmnDbContext())
{
                Process p1 = new Process { Name = "P1", Num = 1 };
                Process p2 = new Process { Name = "P2", Num = 2 };

                p1.Outgoings = new List<Process> { p2 };

                db.Processes.Add(p1);
                db.SaveChanges();

                var list = db.Processes.OrderBy(o=>o.Num).ToList();
}


我只添加了 p1的出口,居然发现p2的入口被自动添加了p1,请问这是为什么








9个回答

︿ 2
其实并不是什么怪异现象,只是你的EF关系建立的有问题
this.HasMany(l => l.Incomings).WithMany();
this.HasMany(l => l.Outcomings).WithMany();
即可
︿ 1
而且,ef自推出到现在,这么多年了,不知道多少人用过,要是连这都没搞好,早就死掉了,
还是多找下自己的原因吧!!
︿ 1
应该由于因为没有指定主外键关系。(这里叫做自联关系)

不过我觉得你很难映射理论上可以无限节点的树结构到关系型数据库。
︿ 1
你的db.SaveChanges()里面做了什么动作么?
你看看db.SaveChanges()之前有没有这个问题,按照道理来说不应该.
︿ 0
肯定是你的实际代码中有地方做了关联,你没发现,如果就这点代码,是不可能出现这种情况的
︿ 0
机器不会犯错,但是EF的设计者加入了一些楼上几位不知道的 约定俗成的 规则,导致出现了上面的现象。

反正代码就那几行,不信可以自己测试