实体框架错误(存储更新,插入或删除语句影响了意外

时间:2012-12-05 06:02:24

标签: entity-framework

我正在开发Entity Framework 4.0。这里使用AddObject()将控制添加到数据库中并保存起来使用SaveChange()方法。

但是一旦我删除了添加的控件并尝试再次添加,我会一次又一次地收到此错误

  

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

我无法添加它。一旦我关闭我的应用程序然后尝试添加然后我能够添加该控件。

我试图在这里搜索很多,但是找不到解决办法。 因为我是实体框架领域的新生。

public void Add(SearchPath entity) {
    _context.SearchPaths.AddObject(entity); 
    // _context.Save(entity, false); 
}

public void Remove(SearchPath entity)
{
    if (entity.Path != null) 
    {
        using (EntityContext entityObj = new EntityContext()) 
        {
            entityObj.SearchPaths.Attach(entity); 
            entityObj.SearchPaths.DeleteObject(entity); 
            entityObj.SaveChanges(); 
        }
    }
} 


public void Modify(SearchPath entity)
{
    using (EntityContext entityObj = new EntityContext())
    {
        try 
        {
            entityObj.SearchPaths.Attach(entity); 
            entityObj.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified); 
            entityObj.SaveChanges(); 
        } 
        catch (OptimisticConcurrencyException) 
        { 
            entityObj.Refresh(RefreshMode.StoreWins, entity); 
            entityObj.SaveChanges(); 
        }
    }
}

public void Add(Package entity)
{
    _context.Packages.AddObject(entity);
}

public void Remove(Package entity) 
{
    if (_context.GetEntityState(entity) == EntityState.Unchanged) 
        _context.Packages.Attach(entity); 
    _context.Packages.DeleteObject(entity);
} 

2 个答案:

答案 0 :(得分:1)

上述问题的答案就是这样调用你自己的保存方法。

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

    }
}

答案 1 :(得分:0)

  

一旦我删除了添加的控件并尝试再次添加

问题是你显然是在同一个环境中做到这一点。对我来说,这表明上下文的生命周期太长了。在EF中使用上下文实例的最佳方法是每个工作单元(或业务事务或用例)的一个上下文。

因此,如果要删除控件:创建上下文,删除控件,配置上下文。如果要再次添加(由于某种原因):创建上下文,添加控件,处置上下文。从你的代码片段中我不完全清楚你的代码是否会发生这种情况。