我的应用程序使用Entity Framework v7。该模型由客户和订单组成。 Customer
可以包含多个Orders
。 Order
只有一个Customer
。
下面的语句检索状态为“已完成”的所有订单,并急切地为每个订单加载关联客户:
var orders = dbcontext.Orders.Include(o => o.Customer).Where(o => o.Status == "Completed")
这将返回预期的订单列表。在检查dbContext.ChangeTracker.Entries
的内容之后,我注意到它不仅包含检索到的订单和客户,还包含属于上述语句中急切加载的那些客户的所有其他订单。即包括那些没有“已完成”状态的订单。这是预期的,因为customer.Orders
应该返回所有订单,而不仅仅是已完成的订单。
但是,在检查这些条目的EntityState
时,虽然“已完成”订单的EntityState
设置为Unchanged
(再次按预期方式),但其他订单(即没有“已完成“状态”,EntityState
设置为Added
。因此,在随后调用dbContext.SaveChanges()
时,EF会尝试INSERT这些命令,从而导致错误。为什么这些订单的EntityState
设置为Added
?我希望它设置为Unchanged
。
更新
以下是演示此问题的完整代码示例:
public void Test()
{
var entriesCountBefore = dbContext.ChangeTracker.Entries().Count();
var orders = dbcontext.Orders.Include(o => o.Customer).Where(o => o.Status == "Completed");
var entriesCountAfter = dbContext.ChangeTracker.Entries().Count();
var entriesCountUnchangedAfter = dbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Unchanged).Count();
var entriesCountAddedAfter = dbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added).Count();
}`
逐步完成此方法后,每个变量的值为:
entriesCountBefore - 0
entriesCountAfter - 5 (consisting of 3 orders and 2 customers)
entriesCountUnchangedAfter - 4 (consisting of 2 orders and 2 customers)
entriesCountAddedAfter - 1 (consisting of 1 order. This is the only order whose status is not "Completed")