1

我正在研究 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);
} 
4

2 回答 2

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

    }
}
于 2012-12-15T11:26:09.517 回答
0

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

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

因此,如果要删除控件:创建上下文,删除控件,处置上下文。如果您想再次添加它(出于某种原因):创建上下文,添加控件,处置上下文。从您的代码片段中,我并不完全清楚这是否发生在您的代码中。

于 2012-12-16T14:00:43.490 回答