【发布时间】:2011-08-21 00:19:02
【问题描述】:
我在使用 linq-to-sql 并尝试解决冲突时遇到了问题。问题是有时没有检测到冲突。请查看以下代码示例:
// Setup the object to re-produce the problem
//
// MyObject has properties: id, my_string, my_int and version (timestamp) to enable
// conflicts detection
var context = new MyDataContext();
var obj = new MyObject();
obj.id = "1";
obj.my_string = "value";
obj.my_int = 0;
context.MyTable.InsertOnSubmit(obj);
context.SubmitChanges();
context.dispose();
// Get 2 data contexts
var context1 = new MyDataContext();
var context2 = new MyDataContext();
// Get 2 instances of obj - 1 from each context
var obj1= context1.MyTable.SingleOrDefault(o => o.id == "1");
var obj2= context2.MyTable.SingleOrDefault(o => o.id == "1");
// Change the values of obj1 and update it to the database
obj1.my_string= "value1";
obj1.my_int= 0;
context1.SubmitChanges();
context1.Dispose();
// Update the changes in obj2
obj2.my_string= "value2";
obj2.my_int= 1;
// Now the database contains:
// id: "1"
// my_string: "value1"
// my_int: 0
// obj2 contains:
// id: "1"
// my_string: "value2"
// my_int: 1
try
{
context2.SubmitChanges();
}
catch(ChangeConflictException ex)
{
LogInfo("Conflicting members:");
context2.ChangeConflicts[0].MemberConflicts.ToList().ForEach(
mcc=>LogInfo("Property '{0}': Database value: {1}, Current Value:{2}", mcc.Member.Name, mcc.DatabaseValue, mcc.CurrentValue)
);
}
context2.Dispose();
在捕获中,我希望看到 3 个成员冲突:my_string、my_int 和版本,但我只看到 2 个成员冲突:my_string 和版本。 my_int 未被检测为冲突。
如果我在创建对象时将 my_int 设置为与我分配给 obj2 的值不同的值,则会检测到冲突。
我发现了一些共性:当原始对象的某个属性(任何属性)的值等于obj1的值时,不会检测到该属性的冲突。
我想知道如何解决这个问题,以便成功检测到冲突
【问题讨论】:
-
这不是
my_int的冲突 - 当从数据库加载obj2时,旧值是0。数据库中的当前值为0。 -
谢谢达米安,确实是这样。
标签: c# linq-to-sql conflict