C# 使用SaveChanges进行实体状态澄清
我使用此答案中显示的技术创建了TrackingDbContext,我现在从中继承了许多上下文,任何需要CreateDate/LastModified属性的实体都从TrackingBase实体继承。到目前为止,它运作得很好 直到今天 最终,我通过改变将这个新实体添加到集合中的方式,解决了我的问题,但我真的不明白为什么原始实体不起作用。。。我想知道,当我想它会一次又一次地咬我,直到我明白为止 最初,我通过创建一个新的status对象并将其添加到order对象的statusItems集合,向orderItem添加一个新的状态记录,如下所示C# 使用SaveChanges进行实体状态澄清,c#,entity-framework,C#,Entity Framework,我使用此答案中显示的技术创建了TrackingDbContext,我现在从中继承了许多上下文,任何需要CreateDate/LastModified属性的实体都从TrackingBase实体继承。到目前为止,它运作得很好 直到今天 最终,我通过改变将这个新实体添加到集合中的方式,解决了我的问题,但我真的不明白为什么原始实体不起作用。。。我想知道,当我想它会一次又一次地咬我,直到我明白为止 最初,我通过创建一个新的status对象并将其添加到order对象的statusItems集合,向order
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不存在。这在我心里很微妙。。如果这真的是我麻烦的原因,那么很容易有人跌入这个陷阱。