实体框架核心 - 不正确的EntityState

时间:2016-06-23 15:25:22

标签: c# entity-framework-core

我的应用程序使用Entity Framework v7。该模型由客户和订单组成。 Customer可以包含多个OrdersOrder只有一个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")

0 个答案:

没有答案