在实体框架中更新记录的最佳做法是什么?

时间:2013-02-21 11:02:04

标签: c# entity-framework-4.1 repository-pattern

我需要使用实体框架4.1(POCO)在单击按钮上更新100条记录。我需要将修改后的记录保存在数据库中而不进行数据库往返(以避免性能问题)。

我已经看到了一些分离和附加的解决方案。

附加时出错 IEntityChangeTracker的多个实例无法引用实体对象

首先尝试分离,得到新的错误 无法分离对象,因为它未附加到ObjectStateManager

我正在使用存储库模式获取实体列表并传递到UI层以便在网格中进行绑定。

在按钮单击中,我将这些实体传回DB层进行更新。

它工作正常,选择实体并执行context.applychanges。出于性能问题,我需要避免这次往返。

    public void Update(OPRPortCall portCall)
    {
        using (VMEntities context = new VMEntities())
        {
            context.Detach(portCall); //The object cannot be detached because it is not attached to the ObjectStateManager.
            context.AttachTo("OPRPortCalls", portCall); //An entity object cannot be referenced by multiple instances of IEntityChangeTracker
            context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified);

            context.SaveChanges();
        }
    }

告诉我任何解决方案。

克里斯托弗

2 个答案:

答案 0 :(得分:1)

从技术上讲,您可以通过首先测试对象是否已经附加来解决此问题:

public void Update(OPRPortCall portCall)
{
    using (VMEntities context = new VMEntities())
    {
        ObjectStateEntry ose;
        this.ObjectStateManager.TryGetObjectStateEntry(portCall, out ose);
        if (ose == null)
        {
            context.OPRPortCalls.Attach(portCall);
        }
        context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified);

        context.SaveChanges();
    }
}

答案 1 :(得分:0)

您只能分离从上下文中检索到的实体,在您创建上下文的示例中(此时它上面没有实体),您尝试分离后。

对于第二个问题,我认为你有另一个附加了实体的上下文,因此你无法将实体附加到第二个上下文。

对于这个问题(附加/分离),避免创建多个上下文并仅使用一个上下文(可能您可以将其作为参数传递给函数或将其设置为私有类变量)。

对于更新100个实体的具体问题,您可以: 1.如果可以为所有实体更新相同的列,则创建存储过程(传递给它一个值并执行UPDATE语句) 2.更新所有实体,然后使用此命令调用SubmitChages()EF执行UPDATE TABLE 100次 3.对数据库执行自定义查询命令,例如“UPDATE TABLE SET ...”

我希望这有帮助。