Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SaveChanges进行实体状态澄清_C#_Entity Framework - Fatal编程技术网

C# 使用SaveChanges进行实体状态澄清

C# 使用SaveChanges进行实体状态澄清,c#,entity-framework,C#,Entity Framework,我使用此答案中显示的技术创建了TrackingDbContext,我现在从中继承了许多上下文,任何需要CreateDate/LastModified属性的实体都从TrackingBase实体继承。到目前为止,它运作得很好 直到今天 最终,我通过改变将这个新实体添加到集合中的方式,解决了我的问题,但我真的不明白为什么原始实体不起作用。。。我想知道,当我想它会一次又一次地咬我,直到我明白为止 最初,我通过创建一个新的status对象并将其添加到order对象的statusItems集合,向order

我使用此答案中显示的技术创建了TrackingDbContext,我现在从中继承了许多上下文,任何需要CreateDate/LastModified属性的实体都从TrackingBase实体继承。到目前为止,它运作得很好

直到今天

最终,我通过改变将这个新实体添加到集合中的方式,解决了我的问题,但我真的不明白为什么原始实体不起作用。。。我想知道,当我想它会一次又一次地咬我,直到我明白为止

最初,我通过创建一个新的status对象并将其添加到order对象的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();
        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/LastModified未更新,它们都为空。我在TrackingDbContext.SaveChanges中加入了断点,果然,搜索修改或添加的实体的过滤器是空的。哇。。这怎么可能

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中,而不是简单地修改我手中已有的对象,以查看是否有差异,就像这样

        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();
        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/ModifiedDate不为null。但是为什么原作不起作用呢?我不能理解的是,新实体中的一个实体被添加到数据库中。。自动检测转换系统必须正常工作。。。当然,它有额外的状态。。。b不知何故,该状态不足以在新添加项的筛选器中找到,因此创建的/ModifiedDate字段没有更新。

在键入此项时,我可能无意中发现了为什么它在第2种方法中有效,而不是在第1种方法中有效的原因。在第一个版本中,Add函数实际上是ICollection.Add。在第二个有效的版本中。。Add是DbSet.Add。啊哈。。Add自动调用DetectChanges并正确标记所有实体。ICollection.Add不存在。这在我心里很微妙。。如果这真的是我麻烦的原因,那么很容易有人跌入这个陷阱。