在使用LINQ to SQL连接更新了几个属性(针对SQL Server Compact Edition)后,对DataContext执行SubmitChanges时,出现“找不到或更改行”。ChangeConflictException。
var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);
deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;
ctx.SubmitChanges();
该查询生成以下SQL:
UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
明显的问题是WHERE 0 = 1,在加载记录之后,我已经确认“ deviceSessionRecord”中的所有属性都正确,可以包含主键。同样,在捕获“ ChangeConflictException”时,没有有关此失败原因的其他信息。我还确认了该异常与数据库中的一条记录(我正在尝试更新的记录)一起引发
奇怪的是,我在不同的代码部分中有一个非常相似的update语句,它生成以下SQL,并且确实更新了SQL Server Compact Edition数据库。
UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
我已经确认在数据库模式和生成LINQ类的DBML中都已经标识了正确的主字段值。
我想这几乎是一个两部分的问题:
- 为什么会引发异常?
- 在检查了第二组生成的SQL之后,似乎对于检测冲突而言,检查所有字段似乎很好,但是我认为这样做效率不高。这是始终有效的方式吗?是否有仅检查主键的设置?
在过去的两个小时中,我一直在与这个问题作斗争,因此我们将不胜感激。