Linq to sql Linq to Sql:未引发ChangeConflictException(且未更新/删除任何行)

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吗 为了清楚起见,这里是我正在运行的测试的设计和流程:我

我正在尝试将LINQtoSQL融入N层设计。我通过在将对象附加到数据上下文时提供原始值来实现并发性。在调用SubmitChanges并观察sql server profiler上生成的脚本时,我可以看到它们是正确生成的。它们包括检查所有对象属性的where子句(它们都用UpdateCheck.Always标记)

结果与预期一致,即更新时不更新行,删除时不删除行。但我没有得到任何例外。这不应该引发ChangeConflictException吗

为了清楚起见,这里是我正在运行的测试的设计和流程:我有一个客户机控制台和一个服务控制台,它们使用WsHttpBinding通过WCF相互通信

  • 客户端从服务请求数据
  • 服务实例化datacontext,检索数据,处理上下文,将数据返回给客户端
  • 客户端对返回的数据进行修改
  • 客户端请求从服务更新已更改的数据。
    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位区域