gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:38:13 25 4
gpt4 key购买 nike

在dbml设计器中,我已将所有属性的Update Check设置为Never。但是我在执行附加操作时仍然遇到异常:“已尝试附加或添加一个不是新的实体,可能是从另一个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(在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();
}


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

关于sql - LINQ SQL附加,更新检查设置为从不,但仍然存在并发冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com