保存实体时也会插入新实体的导航属性

问题描述 投票:0回答:1

保存新对象时,我的对象的导航属性也会被插入。

var car = contextInstance1.GetCar(23);
var passenger = new Passenger{ Car = car, CarId = 23 };
...
contextInstance2.Passengers.Add(passenger);
contextInstance2.Save();

在这种情况下,EF 尝试插入 Car,这会引发异常。如果我在保存之前清除该属性,它会按预期工作。

这是预期的行为吗(由于不同的上下文或其他原因)?有没有办法指示不要尝试插入属性?

entity-framework entity-framework-core
1个回答
0
投票

是的,因为对于上下文 #2,不会跟踪 Car 的实例。设置导航属性时,应始终确保实体由同一 DbContext 实例加载。如果这是不可能的,那么:

检查该实体尚未被第二个 DbContext 跟踪。如果没有,请附上,如果是,请替换参考:

var passenger = new Passenger{ Car = car, CarId = 23 };
...
var trackedCar = contextInstance2.Cars.Local.FirstOrDefault(x => x.CarId == car.CarId);
if (trackedCar != null)
    passenger.Car = trackedCar;
else
    contextInstance2.Attach(passenger.Car);

contextInstance2.Passengers.Add(passenger);
contextInstance2.Save();   

测试DbSet中的

.Local
不会去数据库,只是上下文的本地跟踪缓存。如果我们找到匹配项,那么我们需要更新引用以使用该实例。否则,我们可以附加未跟踪的实例,该实例告诉 EF 期望 Car #23 指向现有记录,而不是视为新车。

© www.soinside.com 2019 - 2024. All rights reserved.