我有一个DevExpress GridControl,包含数据库中的行。使用绑定捕获当前选定的行,其名称为SelectedItem
。
var entry = context.Entry(SelectedItem);
if (entry != null)
{
entry.Entity.Name = addForm.InstrumentName;
entry.Entity.InstrumentType = addForm.InstrumentType;
entry.Entity.Units = addForm.Units;
entry.Entity.RollOver = addForm.RollOver;
entry.State = EntityState.Modified;
try { context.SaveChanges(); }
catch (Exception ex)
{
//ex is of type DbUpdateConcurrencyException
}
}
但是,如果我使用FirstOrDefault
仅使用SelectedItem.ID
来提取新实体,那么我可以进行更改并保存记录。
现在,我一直在努力工作,认为前一种方法是对实体进行更改的首选方法,特别是当该实体引用已经存在时。我错了吗?如果是这样,为什么?
如果我没有,那么有人可以帮助解释为什么我会收到并发错误吗?
例外详细信息:
DbUpdateConcurrencyException:存储更新,插入或删除语句 影响了意外的行数(0)。实体可能已被修改 或者从实体加载后删除。
产生的日志输出(根据要求):
UPDATE [dbo].[Instrument]
SET [EquipmentID] = @0, [Name] = @1, [InstrumentType] = @2, [Units] = @3, [RollOver] = @4
WHERE (([ID] = @5) AND [Timestamp] IS NULL)
SELECT [Timestamp]
FROM [dbo].[Instrument]
WHERE @@ROWCOUNT > 0 AND [ID] = @5
-- @0: '0' (Type = Int32)
-- @1: 'Hour meter' (Type = String, Size = 50)
-- @2: '0' (Type = Int32)
-- @3: 'hours1' (Type = String, Size = 25)
-- @4: '999999.00' (Type = Decimal, Precision = 18, Scale = 2)
-- @5: '2' (Type = Int32)
-- Executing at 4/26/2018 3:57:12 PM -04:00
-- Completed in 2 ms with result: SqlDataReader