EF保存新实体时导航属性被意外插入的问题咨询
Entity Framework 跨上下文关联实体导致重复插入的问题解决
这是跨上下文导致的预期行为吗?
是的,这完全是EF的预期行为。原因很简单:你从contextInstance1加载的car实体,只属于这个上下文的跟踪系统。当你把它关联到新的passenger并添加到contextInstance2时,contextInstance2根本不知道这个car已经在数据库里存在——在它看来,这个car是一个从未被跟踪过的“新实体”,所以执行Save()时会尝试插入它,最终因为主键重复抛出异常。
如何让EF不插入该导航属性?
有几种实用的解决办法:
只设置外键,不赋值导航属性
这是最简单的方式,直接给CarId赋值,完全不碰Car导航属性:var passenger = new Passenger{ CarId = 23 }; contextInstance2.Passengers.Add(passenger); contextInstance2.Save();EF会自动通过外键关联到对应的Car实体,不会处理导航属性对应的对象。
将关联实体标记为已存在(Unchanged)
如果必须保留导航属性的引用,先把car附加到当前上下文,并标记为“无变化”,告诉EF这个实体已经在数据库里了:var car = contextInstance1.GetCar(23); var passenger = new Passenger{ Car = car, CarId = 23 }; contextInstance2.Attach(car); contextInstance2.Entry(car).State = EntityState.Unchanged; contextInstance2.Passengers.Add(passenger); contextInstance2.Save();从当前上下文加载关联实体
放弃从contextInstance1获取Car,直接用contextInstance2的Find方法加载:var car = contextInstance2.Cars.Find(23); var passenger = new Passenger{ Car = car, CarId = 23 }; contextInstance2.Passengers.Add(passenger); contextInstance2.Save();这样Car属于
contextInstance2的跟踪对象,EF明确知道它已存在,只会建立关联而不会插入。
内容的提问来源于stack exchange,提问作者Tony Basallo
相关产品推荐
相关产品推荐

