LINQ SQL附加,更新检查设置为从不,但仍存在并发冲突

LINQ SQL附加,更新检查设置为从不,但仍存在并发冲突,sql,linq,sql-update,Sql,Linq,Sql Update,在dbml设计器中,我已将所有属性的更新检查设置为从不。但在执行附加时,我仍然会遇到一个例外:“有人试图附加或添加一个并非新的实体,可能是从另一个DataContext加载的。这是不受支持的。”这种方法似乎适用于这里的其他人,但我一定错过了一些东西 using(TheDataContext dc = new TheDataContext()) { test = dc.Members.FirstOrDefault(m => m.fltI

在dbml设计器中,我已将所有属性的更新检查设置为从不。但在执行附加时,我仍然会遇到一个例外:“有人试图附加或添加一个并非新的实体,可能是从另一个DataContext加载的。这是不受支持的。”这种方法似乎适用于这里的其他人,但我一定错过了一些东西

        using(TheDataContext dc = new TheDataContext())
        {
            test = dc.Members.FirstOrDefault(m => m.fltId == 1);
        }

        test.Name = "test2";

        using(TheDataContext dc = new TheDataContext())
        {
            dc.Members.Attach(test, true);
            dc.SubmitChanges();
        }

错误消息准确地说明了问题所在:您正试图附加从另一个DataContext加载的对象,在您的情况下,是从DataContext的另一个实例加载的。在更改值并提交更改之前,不要处置DataContext(在
语句末尾使用它被处置)。这应该是可行的(使用
语句将所有功能集于一身)。我刚刚看到您希望将该对象再次附加到members集合,但它已经在那里了。不需要这样做,这也应该起作用:

using(TheDataContext dc = new TheDataContext())
{
    var test = dc.Members.FirstOrDefault(m => m.fltId == 1);
    test.Name = "test2";
    dc.SubmitChanges();
}
只需更改值并提交更改

最新更新: (已删除所有以前的3个更新)

我以前的解决方案(从这篇文章中再次删除),发现是危险的。我只是在网上读到这个:

“仅在新服务器上调用附加方法 或者反序列化实体。唯一的方法 用于将实体从其 原始数据上下文是为它准备的 序列化。如果您尝试附加 未附加到新数据的实体 上下文,并且该实体仍然具有 从以前的加载程序中延迟加载程序 数据上下文,将抛出LINQ到SQL 一个例外。一个延迟的实体 来自两个不同数据的加载程序 上下文可能导致不必要的结果 执行插入、更新和 删除对该实体的操作。对于 有关延期付款的更多信息 装载机,请参阅延迟与立即 正在加载(LINQ到SQL)。”

改用这个:

// Get the object the first time by some id
using(TheDataContext dc = new TheDataContext())
{
    test = dc.Members.FirstOrDefault(m => m.fltId == 1);
}

// Somewhere else in the program
test.Name = "test2";

// Again somewhere else
using(TheDataContext dc = new TheDataContext())
{
    // Get the db row with the id of the 'test' object
    Member modifiedMember = new Member()
    {
        Id = test.Id,
        Name = test.Name,
        Field2 = test.Field2,
        Field3 = test.Field3,
        Field4 = test.Field4
    };

    dc.Members.Attach(modifiedMember, true);
    dc.SubmitChanges();
}

复制对象后,将分离所有引用,并且所有事件处理程序(从db延迟加载)都不会连接到新对象。只将值字段复制到新对象中,该对象现在可以保存地附加到members表。此外,您不必使用此解决方案再次查询数据库。

可以从另一个datacontext附加实体

在第一篇文章中,唯一需要添加到代码中的是:

dc.DeferredLoadingEnabled = false
但这是一个缺点,因为延迟加载非常有用。我在本页的某个地方读到另一个解决方案是将所有属性的更新检查设置为从不。这篇文章也说了同样的话:


但是,即使将更新检查设置为从不,我也无法使其工作。

这是我的存储库类中的一个函数,用于更新实体

protected void Attach(TEntity entity)
{
   try
    {
       _dataContext.GetTable<TEntity>().Attach(entity);
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
    catch (DuplicateKeyException ex) //Data context knows about this entity so just update values
    {
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
}

我发布的代码只是一种简化。我需要能够从数据库中检索一个成员,然后以分离模式处理它。然后稍后在其他地方更新数据库中的该成员。我不能在同一个datacontext中完成所有操作。这不起作用,您必须保持在同一个上下文中,这意味着您必须在从中检索对象的datacontext的同一实例上执行附加和提交更改操作。这是您要找的吗?当然,这不是一个非常优雅的解决方案,但是你不能切换上下文。另一种方法是将datacontext保存在静态变量中,直到最后一次submitchanges调用。但似乎没有必要在每次更新之前进行选择。这就是为什么我一直在尝试使用Attach。但我不太明白为什么微软添加了这个方法,因为它的可用性似乎非常有限。再次更新了我的答案。问题可能是仍然存储在对象中的引用。如果我的上一个解决方案有效,您可以保持启用延迟加载。
_dataContext.Attach(entity);