我需要使用实体框架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();
}
}
告诉我任何解决方案。
克里斯托弗
答案 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 ...”
我希望这有帮助。