C# 为什么试图通过实体引用进行更新会在EF6中引发此异常?

C# 为什么试图通过实体引用进行更新会在EF6中引发此异常?,c#,entity-framework-6,C#,Entity Framework 6,我有一个DevExpress GridControl,其中包含数据库中的行。使用绑定捕获当前选定的行,其名称为SelectedItem 然后,我尝试编辑该行的数据,如下所示: var entry = context.Entry(SelectedItem); if (entry != null) { entry.Entity.Name = addForm.InstrumentName; entry.Entity.InstrumentType = addForm.Instrument

我有一个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
    }
}
但是,如果我使用
first或default
仅使用
SelectedItem.ID
提取新实体,则可以进行更改并保存记录

现在,我一直在努力,认为前一种方法是对实体进行更改的首选方法,特别是当实体引用已经在手时。我错了吗?若然,原因为何

如果我不是,那么有人能帮我解释一下为什么我可能会出现并发错误吗

异常详细信息:

DbUpdateConcurrencyException:存储更新、插入或删除语句 受影响的行数意外(0)。实体可能已被修改 或自加载实体后删除

结果日志输出(根据要求):


如果设置了属性,您得到的完整错误消息是什么,以及
InnerException
错误消息是什么?@Progman我已经用异常详细信息更新了问题。您如何知道您的
SelectedItem
对象将是新记录或将更新现有记录?@Progman我不了解。它是表示数据库中记录的实体。它不能是新记录,因为它已经是新记录。请添加
context.Database.Log=It=>System.Diagnostics.Debug.Write(It)到您的上下文,以查看实体框架生成的SQL语句。编辑问题以包含生成的SQL语句。基于此,看起来数据库中的值在此期间发生了更改和/或您的主键出现了问题。但根据我的观点,它应该是有效的。
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