使用在多个列上具有主键的实体框架更新数据库

Posted

技术标签:

【中文标题】使用在多个列上具有主键的实体框架更新数据库【英文标题】:Update Database using Entity Framework having primary key on multiple Columns 【发布时间】:2015-06-06 16:08:57 【问题描述】:

以下是我得到的错误信息:

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=472540。

我的模型由几列组成,其中两列构成集群的主键:

[Key]
[Column(Order = 0)]
public string SourceName  get; set; 
[Key]
[Column(Order = 1)]
public string SourceType  get; set; 

使用实体框架更新的代码:

 _Entities.SourceInfoes.Attach(entity);
 _Entities.Entry(entity).State = EntityState.Modified;
 _Entities.SaveChanges();

有人可以帮我解决上述异常吗?

【问题讨论】:

您的“更新”功能是否存在于任何 for 循环或计时器中?大多数时候,我注意到当 _Entities.SaveChanges() 当前正在执行(但尚未完成)时会发生此错误,同时,可能有 EF READ istaking to the same row (same record) 。这些代码sn-ps很难帮助。 可能实际配置了乐观并发,并且在没有(或过期)并发令牌的情况下附加了entity。没有足够的细节来回答这个问题。 【参考方案1】:

在保存更改之前,您是否确保所有非空属性都有值?

在我的情况下,我必须在视图中添加一个隐藏值,因此主键将被发送回服务器。

@html.HiddenFor(model => model.Id)

【讨论】:

我没有隐藏任何字段。【参考方案2】:

对我来说,问题是我的数据库中某些列的唯一索引。违反索引导致显示此错误。

但是当我在寻找解决方案时,我发现这个错误也可能有其他原因,比如确保键有值并且不为空,检查列的并发设置。

【讨论】:

以上是关于使用在多个列上具有主键的实体框架更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先:迁移失败并更新数据库,强制不必要的(?)添加迁移

带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键

具有两个主键的 Laravel 模型更新 [重复]

如何首先在实体框架代码中设置身份主键的起始值?

多个添加的实体可能在数据库种子上具有相同的主键

如何在实体框架中使用字符串属性作为主键