为什么尝试通过实体引用进行更新会在EF6中抛出此异常?

时间:2018-04-23 16:38:46

标签: c# entity-framework-6

我有一个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

0 个答案:

没有答案