1

私は Entity Framework 4.0 に取り組んでいます。ここでは、AddObject() を使用してデータベースにコントロールを追加し、SaveChange() メソッドを使用して保存します。

しかし、その追加されたコントロールを削除して再度追加しようとすると、このエラーが何度も発生します

Store update、insert、または delete ステートメントが予期しない数の行 (0) に影響を与えました。エンティティが読み込まれてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

追加できません。アプリケーションを閉じてから追加しようとすると、そのコントロールを追加できます。

私はあちこちでうまくいかない方法をたくさん検索しようとしましたが、解決策を見つけることができませんでした. 私はEntity Frameworkの分野で生まれたばかりです。

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でコンテキストインスタンスを使用する最良の方法は、作業単位(またはビジネストランザクション、またはユースケース)ごとに1つのコンテキストです。

したがって、コントロールを削除する場合は、コンテキストを作成し、コントロールを削除して、コンテキストを破棄します。(何らかの理由で)再度追加する場合:コンテキストを作成し、コントロールを追加し、コンテキストを破棄します。あなたのコードスニペットから、これがあなたのコードで起こるかどうかは私には完全には明らかではありません。

于 2012-12-16T14:00:43.490 に答える