解决scheme:存储更新,插入或删除语句影响意外数量的行(0)

我find了一个解决scheme,为谁得到一个例外:

存储更新,插入或删除语句影响了意外数量的行(0)。 实体被加载后,实体可能已被修改或删除。 刷新ObjectStateManager条目。

但是,无论如何,我有问题。

我读了主题: entity framework:“存储更新,插入或删除语句影响了意外数量的行(0)”。 对于VMAtm,罗伯特·哈维

在我的例子中,我有例如表格文章:

Articles ------------ article_id title date_cr date_mod deleted 

我触发了:

 create trigger articles_instead_of_insert on articles instead of insert as SET NOCOUNT ON; insert into articles( article_id, title, date_cr, date_mod, deleted ) select user_id, title, isnull(date_cr, {fn NOW()}), isnull(date_mod, {fn NOW()}), isnull(deleted, 0) from inserted; go 

当我删除这个触发器,然后我没有得到这个exception。 所以这个触发器是问题。 现在我有一个问题 – 为什么? 我应该做点什么吗?

解:

 try { context.SaveChanges(); } catch (OptimisticConcurrencyException) { context.Refresh(RefreshMode.ClientWins, db.Articles); context.SaveChanges(); } 

它更好地更新你的保存方法是这样的…..如果你调用每个addobject和deleteobject或修改后的实体上下文的savechange()方法:

 public void Save(object entity) { using (var transaction = Connection.BeginTransaction()) { try { SaveChanges(); transaction.Commit(); } catch (OptimisticConcurrencyException) { if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified) this.Refresh(RefreshMode.StoreWins, entity); else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added) Detach(entity); AcceptAllChanges(); transaction.Commit(); } } } 

这是因为你有SET NOCOUNT ON
它生成的EF SQL语句总是添加where @@ROWCOUNT > 0 and [ID] = scope_identity() (例如)的子句。
注意where @@ROWCOUNT > 0子句。 脱下你的SET NOCOUNT ON声明,它应该工作。

可能的问题:您在实体键的元数据中放置了一个ReadOnlyAttribute,使其值变为零

  [DisplayName("Student ID")] [ReadOnly(true)] public int StudentID { get; set; } 

解决scheme:删除ReadOnlyAttribute

  [DisplayName("Student ID")] public int StudentID { get; set; } 

我有同样的问题,这个错误信息是一个相当神秘的。 webtrifusion的答案帮助了我。 请参阅entity framework:“存储更新,插入或删除语句会影响意外数量的行(0)”。

事实certificate,我忘了在客户端的JSON中添加“Id:0”。

我有InsertAsync设置EntityState修改实现一个存储库模式 。 debugging时,我发现实体的ID是0

  public async Task InsertAsync(T entity) { dbContext.Entry(entity).State = EntityState.Modified; await dbContext.SaveChangesAsync(); } 

更改实体状态添加修复它。

  dbContext.Entry(entity).State = EntityState.Added; 

我发现这个错误,当我更新实体,忘记传递主键值….

所以实体可以用主键引用来更新logging

解决scheme:检查主键值是否通过来更新给定的logging。 🙂

我有同样的错误,然后我意识到,我忘了表中的设置主键和设置增量值…

首先使用实体​​框架代码,

使用(MyDbContext db = new MyDbContext()){..

在使用行之后添加这个:

 db.Configuration.ValidateOnSaveEnabled = true;