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

nos*_*bor 25 sql sql-server triggers entity-framework entity-framework-4

我为获得例外的人找到了一个解决方案:

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

但是,无论如何我有疑问.

我读了主题: 实体框架:"存储更新,插入或删除语句影响了意外的行数(0)." 对于VMAtm,Robert Harvey

就我而言,我有例如表格文章:

Articles
------------
article_id
title
date_cr
date_mod
deleted
Run Code Online (Sandbox Code Playgroud)

我有触发器:

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
Run Code Online (Sandbox Code Playgroud)

当我删除此触发器时,我不会得到此异常.所以这个触发器就是问题.现在我有一个问题 - 为什么?我应该做点什么吗?

nos*_*bor 37

解:

try {
    context.SaveChanges();
} catch (OptimisticConcurrencyException) {
    context.Refresh(RefreshMode.ClientWins, db.Articles);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

  • 我也有这个问题,但找不到`刷新'.这有助于:http://stackoverflow.com/questions/13177718/dbcontext-does-not-contain-a-definition-for-refresh (11认同)
  • 刷新方法解决了刷新对象上下文的可靠性冲突.第一个参数告诉哪些值应该获胜.请参阅http://msdn.microsoft.com/library/bb896255(v=vs.110).aspx (3认同)

小智 6

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

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();
          }

    }
}
Run Code Online (Sandbox Code Playgroud)