Linq to sql Linq to Sql:未引发ChangeConflictException(且未更新/删除任何行)
我正在尝试将LINQtoSQL融入N层设计。我通过在将对象附加到数据上下文时提供原始值来实现并发性。在调用SubmitChanges并观察sql server profiler上生成的脚本时,我可以看到它们是正确生成的。它们包括检查所有对象属性的where子句(它们都用UpdateCheck.Always标记) 结果与预期一致,即更新时不更新行,删除时不删除行。但我没有得到任何例外。这不应该引发ChangeConflictException吗 为了清楚起见,这里是我正在运行的测试的设计和流程:我有一个客户机控制台和一个服务控制台,它们使用WsHttpBinding通过WCF相互通信Linq to sql Linq to Sql:未引发ChangeConflictException(且未更新/删除任何行),linq-to-sql,concurrency,n-tier-architecture,Linq To Sql,Concurrency,N Tier Architecture,我正在尝试将LINQtoSQL融入N层设计。我通过在将对象附加到数据上下文时提供原始值来实现并发性。在调用SubmitChanges并观察sql server profiler上生成的脚本时,我可以看到它们是正确生成的。它们包括检查所有对象属性的where子句(它们都用UpdateCheck.Always标记) 结果与预期一致,即更新时不更新行,删除时不删除行。但我没有得到任何例外。这不应该引发ChangeConflictException吗 为了清楚起见,这里是我正在运行的测试的设计和流程:我
5a。服务实例化datacontext、附加对象和…
5b。我暂停执行并更改数据库中的值,以引起更改冲突
5c。服务调用SubmitChanges李> 以下是第5步的代码,为了清晰起见进行了一些清理:
public void UpdateEntities(ReadOnlyChangeSet<Entity> changeSet)
{
using (EntityDataContext context = new EntityDataContext())
{
if (changeSet.AddedEntities.Count > 0)
{
context.Entities.InsertAllOnSubmit(changeSet.AddedEntities);
}
if (changeSet.RemovedEntities.Count > 0)
{
context.Entities.AttachAll(changeSet.RemovedEntities, false);
context.Entities.DeleteAllOnSubmit(changeSet.RemovedEntities);
}
if (changeSet.ModifiedRecords.Count > 0)
{
foreach (var record in changeSet.ModifiedRecords)
{
context.Entities.Attach(record.Current, record.Original);
}
}
// This is where I pause execution and make changes to the database
context.SubmitChanges();
}
}
public void UpdateEntities(只读更改集更改集)
{
使用(EntityDataContext上下文=新EntityDataContext())
{
if(changeSet.AddedEntities.Count>0)
{
context.Entities.InsertAllOnSubmit(changeSet.AddedEntities);
}
如果(changeSet.RemovedEntities.Count>0)
{
context.Entities.AttachAll(changeSet.RemovedEntities,false);
context.Entities.DeleteAllOnSubmit(changeSet.RemovedEntities);
}
如果(changeSet.ModifiedRecords.Count>0)
{
foreach(变更集.ModifiedRecords中的var记录)
{
context.Entities.Attach(record.Current,record.Original);
}
}
//这是我暂停执行并对数据库进行更改的地方
context.SubmitChanges();
}
}
正如您所看到的,我正在使用一些类来跟踪更改和维护原始内容
谢谢你的帮助
编辑:我对插入没有问题。为了完整起见,我只包含了调用InsertAllOnSubmit的代码。因此我找到了答案。这似乎是LINQtoSQL中的一个bug(如果我错了,请纠正我)。事实证明,数据库中正在更新的表上有一个触发器。此触发器调用具有返回值的存储过程。这会导致对此表的insert、update或delete调用产生一个返回值(来自触发器运行的存储过程),该值不是行计数,而是一个数字。显然L2S看到了这个数字,并假设一切进展顺利,即使没有实际发生插入/更新/删除 这是非常奇怪的,尤其是考虑到返回的数字有一个定义的列名,并且它的值在6位区域