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

a7qyws3x  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(114)

在dbml设计器中,我已经将所有属性的更新检查设置为“从不”。但在执行Attach时仍然会出现异常:“试图附加或添加一个不是新的实体,可能是从另一个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();
        }
sxissh06

sxissh061#

错误消息确切地说明了发生了什么问题:您正在尝试附加一个从另一个DataContext加载的对象,在您的示例中是从DataContext的另一个示例加载的对象。(在using语句的末尾,它会被释放),然后再更改值并提交更改。(所有都在一个using语句中)。我刚刚看到你想再次将对象附加到members集合,但它已经在那里了。不需要这样做,这应该同样有效:

using(TheDataContext dc = new TheDataContext())
{
    var test = dc.Members.FirstOrDefault(m => m.fltId == 1);
    test.Name = "test2";
    dc.SubmitChanges();
}

只需更改值并提交更改即可。

最新更新:

  • (已删除所有以前的3个更新)*

我以前的解决方案(从这篇文章中再次删除),发现here是危险的。我刚刚在MSDN article上读到了这个:
“仅对新的或反序列化的实体调用Attach方法。将实体从其原始数据上下文分离的唯一方法是将其序列化。如果您试图将未分离的实体附加到新的数据上下文,并且该实体仍然具有来自其先前数据上下文的延迟加载程序,LINQ to SQL将引发异常。具有来自两个不同数据上下文的延迟加载器的实体在执行插入、更新、有关延迟加载器的详细信息,请参阅延迟加载与即时加载(LINQ to 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();
}

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

brccelvz

brccelvz2#

可以附加来自另一个datacontext的实体。
在第一篇文章中,唯一需要添加到代码中的是:

dc.DeferredLoadingEnabled = false

但这是一个缺点,因为延迟加载非常有用。我在本页的某个地方读到另一个解决方案是将所有属性的更新检查设置为Never。这段文字是一样的:http://complexitykills.blogspot.com/2008/03/disconnected-linq-to-sql-tips-part-1.html
但我不能让它工作,即使设置更新检查为从不。

vbkedwbf

vbkedwbf3#

这是Repository类中的一个函数,我使用它来更新实体

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);
    }
}

其中TEntity是您的DB类,根据您的设置,您可能只想执行以下操作

_dataContext.Attach(entity);

相关问题