使用SaveChanges澄清EntityState

时间:2014-04-22 15:27:58

标签: c# entity-framework

我使用了这个答案(https://stackoverflow.com/a/6282472/2045385)中显示的技术来创建一个TrackingDbContext,我现在继承了我的许多上下文,并且任何需要CreateDate / LastModified属性的实体都继承自TrackingBase实体。到目前为止,它运作良好。

直到今天。

最终我通过改变将这个新实体添加到集合中的方式已经解决了我的问题,但我并不理解原来为什么不起作用......而且我喜欢要理解,因为我认为它会一次又一次地咬我,直到我理解它为止。

最初我通过创建一个新的状态对象并将其添加到订单对象的statusItems集合中,向orderItem添加了一个新的状态记录,如上所示。

        var newlyPaidOrders = shopDB.shopOrders
            .Where(o => o.status == "NEW" &&
                          o.payment >= o.cost)
            .ToList();

        for (int i = 0; i< newlyPaidOrders.Count; i++) 
        {
            var paidOrder = newlyPaidOrders.ElementAt(i);
            foreach ( var paidItem in paidOrder.orderItems )
            {
                shopOrderItemStatus sois = new shopOrderItemStatus
                {
                    status = "PAID",
                    agent = "cronjob",
                    shopOrderItem = paidItem,
                    comment = ""
                };
                paidItem.shopItemOrderStatus.Add(sois);
            }
            paidOrder.status = "PAID";
        }
        if (newlyPaidOrders.Count > 0)
            shopDB.SaveChanges();

在SaveChanges()之后,我可以看到新的状态对象是在数据库中创建的,但是......嘿! CreateDate / LastModified未更新,它们都为null。我在TrackingDbContext.SaveChanges()中添加了断点,当然,搜索Modified或Added实体的过滤器也是空的。哇..怎么会这样?

IEnumerable<ObjectStateEntry> objectStateEntries =
    from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
        where
            e.IsRelationship == false &&
            e.Entity != null &&
            typeof(TimestampTrackingBase).IsAssignableFrom(e.Entity.GetType())
        select e;

今天早上我起床了,而且通常情况下,睡眠给人一种全新的视角。我决定直接将项目添加到context.dbset,而不是简单地修改我手中已有的对象,看看是否存在差异,如此。

        for (int i = 0; i< newlyPaidOrders.Count; i++) 
        {
            var paidOrder = newlyPaidOrders.ElementAt(i);
            foreach ( var paidItem in paidOrder.orderItems )
            {
                shopOrderItemStatus sois = new shopOrderItemStatus
                {
                    status = "PAID",
                    agent = "cronjob",
                    shopOrderItem = paidItem,
                    comment = ""
                };
                shopDB.shopOrderItemStatus.Add(sois);
            }
            paidOrder.status = "PAID";
        }

现在......它现在按预期工作,CreateDate / ModifiedDates不为null。但为什么原来不起作用?我无法理解的是(a)新实体被添加到数据库中的概念......自动DetectChanges()系统必须正常工作......并且肯定它有&#34;已添加()&#34;状态...(b)某种程度上,在过滤器中找到新添加的项目是不够的,因此Created / ModifiedDate字段没有更新。

0 个答案:

没有答案