2011-01-31 9 views
2

Entity Framework CTP5コードでPOCOオブジェクトを削除しようとして問題が発生しました。Entity Framework CTP5でPOCOオブジェクトを削除しようとすると問題が発生しました

私は自分のDeleteメソッドと両方の統合テストから始めます。最初の統合テストは合格/合格、2回目は合格しません。

public class GenericRepository<T> : IRepository<T> where T : class 
{ 
    public GenericRepository(DbContext unitOfWork) 
    { 
    Context = unitOfWork; 
    } 

    ... 

    public void Delete(T entity) 
    { 
    if (entity == null) 
    { 
     throw new ArgumentNullException("entity"); 
    } 

    if (Context.Entry(entity).State == EntityState.Detached) 
    { 
     Context.Entry(entity).State = EntityState.Deleted; 
    } 
    Context.Set<T>().Remove(entity); 
    } 

    ... 
} 

これは、私の一般的なRepoのDeleteメソッドです。今、私の統合テストに

[OK]を.. ....

[TestMethod] 
public void DirectlyDeleteAPoco() 
{ 
    // Arrange. 
    var poco = new Poco {PocoId = 1}; 

    // Act. 
    using (new TransactionScope()) 
    { 
    PocoRepository.Delete(poco); 
    UnitOfWork.Commit(); 

    // Now try and reload this deleted object. 
    var pocoShouldNotExist = 
     PocoRepository.Find() 
     .WithId(1) 
     .SingleOrDefault(); 

    Assert.IsNull(pocoShouldNotExist); 
    } 
} 

働き、これは...

[TestMethod] 
public void DeleteAPocoAfterLoadingAnInstance() 
{ 
    // Arrange. 
    var existingPoco = PocoRepository.Find().First(); 
    var detachedPoco = new Poco {PocoId = existingPoco.PocoId}; 

    // Act. 
    using (new TransactionScope()) 
    { 
    PocoRepository.Delete(detachedPoco); 
    UnitOfWork.Commit(); 

    // Now try and reload this deleted object. 
    var pocoShouldNotExist = 
     PocoRepository.Find() 
     .WithId(existingPoco.PocoId) 
     .SingleOrDefault(); 

    Assert.IsNull(pocoShouldNotExist); 
    } 
} 

この第二の一つは、次の例外をスローしません: -

System.InvalidOperationException: がすでに同じキーを持つ オブジェクトがObjに存在するectStateManager。 ObjectStateManagerは、同じキーを持つ複数のオブジェクトを で追跡することはできません。私が正しく、私はオブジェクトグラフに2つ目のポコオブジェクトを(つまりdetachedPoco)を追加しようとしている..しかし、私は1つが既に存在していることができないので、ということを理解している場合

さて、(existingPocoは私が事前にロードされました)。 Ok ...しかし、私はこれに気を付けるべきではないと思う。消費者として、私はこれらのObjectManagersやものについて気にしたくありません。私はちょうど私のポコのセーブ/削除をしたいです。

これらのシナリオを反映するように私の削除メソッドを変更するにはどうすればよいですか?お願いします?

答えて

1

あなたは正しいです。削除はAttachのラッパーであり、状態を「Deleted」に設定するだけで、ObjectContext(DbContextにラップされている)がオブジェクトを削除する必要があることがわかる唯一の方法です。

私はあなたがDbSetの新CTP5機能を使用しようとすることができますね - Localをし、最初の同じIDが付加エンティティを検索してみてください。

var attached = Context.Set<T>().Local.FirstOrDefault(e => e.Id == entity.Id); 
if (attached != null) 
{ 
// Delete attached 
} 
else 
{ 
// Delete entity 
} 
+0

こんにちはラディスラフ、あなたは添付の削除によって何を意味するか、またはエンティティを削除しますか? 両方を実装する方法 – IamStalker

関連する問題