当前位置: 首页 > 编程语言 > C#

保存单个实体而不是整个上下文共享

时间:2023-04-10 16:41:45 C#

保存单个实体而不是整个上下文我遇到了一个场景,我基本上需要对一对多关联的子实体进行更改到数据库,但不保存对父实体所做的任何更改的更改。实体框架目前处理上下文范围内的数据库提交(EntityContext.SaveChanges()),这对于强制关系等是有意义的。但我想知道是否有一些最佳实践或者推荐的方法来做好它-数据库提交个人实体而不是整个上下文。最佳实践?除此之外,“不要那样做!”是什么意思?我认为没有单一的最佳实践可以使ObjectContext不同于数据库的状态。如果您必须这样做,我会创建一个新的ObjectContext并更改那里的子实体。这样,两种情况是一致的。我有类似的需求。我正在考虑的解决方案是在所有实体上实现包装器属性,这些实体私下存储任何属性更改,而不影响实际的实体属性。然后我会向实体添加一个SaveChanges()方法,该方法会将更改写入实体,然后在上下文中调用SaveChanges()。这种方法的问题是您需要使所有实体都符合这种模式。但是,它似乎工作正常。它还有另一个缺点,如果您对包含大量数据的大量对象进行大量更改,您最终会在内存中得到不相关的副本。我能想到的唯一其他解决方案是,保存更改后,保存所有已更改/添加/删除的实体的实体状态,将它们设置为未修改,但您正在更改的实体除外,保存更改,然后恢复其他实体的状态。但这听起来可能很慢。这可以通过使用AcceptAllChanges()来完成。对父实体进行更改,调用AcceptAllChanges(),然后对相关实体进行更改并调用SaveChanges()。您对父项的更改不会保存,因为它们已“提交”到实体但未保存到数据库中。以上就是C#学习教程:保存单个实体而不是整个上下文的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——using(AdventureWorksEntitiesadv=newAdventureWorksEntities()){varcompleteHeader=(fromoinadv.SalesOrderHeader.Include("SalesOrderDetail")其中o.DueDate>System.DateTime.Now选择o).First();completeHeader.ShipDate=System.DateTime.Now;adv.AcceptAllChanges();vardetails=completeHeader.SalesOrderDetail.Where(x=>x.UnitPrice>10.0m);foreach(详细的SalesOrderDetaild){d.UnitPriceDiscount+=5.0m;}adv.SaveChanges();不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: