解决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;