2013-02-21 68 views
3

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

我已经看到一些解决方案与附加。

得到错误的附加 一个实体对象不能被IEntityChangeTracker的多个实例

所以尝试分离第一次引用,得到了新的错误 对象不能被分离,因为它没有连接到ObjectStateManager

我使用存储库模式来获取实体列表并传递到UI层绑定在gri d。

在按钮点击,我传递这些实体返回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(); 
     } 
    } 

向我提供任何解决方案。

克里斯托弗

+0

你能后的更新代码?特别是,当你打开和关闭dbcontext。 – 2013-02-21 11:07:06

+0

“所以先尝试分离,得到新的错误” - 您需要将它从它所连接的上下文中分离出来。它不会附加到新的上下文中,因此将它从新的上下文中分离出来并不是也不行。但是如果你仍然有旧的上下文(并且你做了,否则该实体不能被附加到它),为什么不直接在这个旧的上下文中调用'SaveChanges()'? – hvd 2013-02-21 11:22:27

+0

dtryon更新了代码。请检查。 – ChristopherJ 2013-02-21 11:22:53

回答

0

,可以分离只能从上下文中检索实体,在你的榜样,你创建上下文(在这一刻没有实体就可以了)后,你尝试分离。

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

对于这个问题(附加/分离),避免创建多个上下文并使用ONLY ONE上下文(也许你可以将它作为函数参数传递或设置为私有类变量)。

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

我希望这可以帮到您。

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(); 
    } 
} 
相关问题