gpt4 book ai didi

c# - 如何在 Entity Framework 中保存组合的(新的+修改的)分离实体?

转载 作者:太空狗 更新时间:2023-10-29 21:41:54 24 4
gpt4 key购买 nike

保存组合的新的和修改后的分离 POCO 实体的正确且快速的方法是什么?

我在想这些方法:

    private void Method_2(IList<Entity> entities) //detached entities
{
//This method is using SELECT to check if entity exist
using (var context = new ModelContainer())
{
foreach (Entity entity in entities)
{
var foundEntity = context.CreateObjectSet<Entity>().SingleOrDefault(t => t.Id == entity.Id);
context.Detach(foundEntity); //Remove it from ObjectStateManager

if (foundEntity != null)//It is modified entity
{
context.AttachTo("EntitySet", entity); //Attach our entity
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); //We know it exists
}
else//It is new entity
{
context.CreateObjectSet<Entity>().AddObject(entity);
}
}
context.SaveChanges();
}
}

private void Method_1(IList<Entity> entities) //detached entities
{
//This method doesn't select anything from DB, but i have ta call Savechanges after each object
using (var context = new ModelContainer())
{
foreach (Entity entity in entities)
{
try
{
context.AttachTo("EntitySet", entity);
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
context.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Added);
context.SaveChanges();
}
}
}
}

When you are working in detached environment you have to know which entity was added and which is modified - it is your responsibility to keep this information and provide it to ObjectContext.

好吧,如果您发现自己需要在 EF 中使用这样的 EF 代码,那么我同意这种说法,这肯定是您的决定有问题。我为这项工作选择了错误的工具。

最佳答案

当您在分离环境中工作时,您必须知道添加了哪些实体以及修改了哪些实体 - 您有责任保留此信息并将其提供给 ObjectContext。

最简单的方法是:

foreach (var entity in entities)
{
if (entity.Id == 0) // 0 = default value: means new entity
{
// Add object
}
else
{
// Attach object and set state to modified
}
}

该示例要求您有一些数据库自动生成的主键 (Id)。

您的方法 2 可以进行一些修改。加载实体时不需要分离实体。而是使用 ApplyCurrentValues .当您决定使用对象图而不是单个实体时,首先加载实体的方法非常有用。但是在对象图的情况下,您必须手动进行同步。 ApplyCurrentValues 仅适用于标量(非导航)属性。您可以尝试进一步优化您的方法,以在单次往返数据库中加载所需的实体,而不是一个一个地加载实体。

您的方法 1 是糟糕的解决方案。使用在数据库服务器上引发的异常来控制程序流是一种糟糕的方法。

关于c# - 如何在 Entity Framework 中保存组合的(新的+修改的)分离实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com