2011-01-31 4 views
2

Je rencontre un problème lors de la tentative de suppression d'un objet POCO avec mon code Entity Framework CTP5.Je n'arrive pas à essayer de supprimer un objet POCO dans Entity Framework CTP5

Je vais commencer par ma méthode Delete, puis les deux tests d'intégration. Le premier test d'intégration réussit/fonctionne, le second ne fonctionne pas.

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

    ... 
} 

Voilà donc mon repo générique avec une méthode Delete.

Ok .. maintenant à mes tests d'intégration ....

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

qui fonctionne, ce qui ne fonctionne pas ...

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

Cette deuxième lève l'exception suivante: -

System.InvalidOperationException: un objet avec la même clé déjà existe dans Obj. ectStateManager. Le ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé.

Maintenant, si je comprends bien, je suis en train d'ajouter un second objet Poco (c.-à-detachedPoco) au graphe d'objet .. mais je ne peux pas parce que l'on existe déjà (le existingPoco I préchargés). Ok ... mais je sens que je ne devrais pas m'en soucier. En tant que consommateur, je ne veux pas me soucier de ces ObjectManagers et autres. Je veux juste avoir mon poco juste sauvegarder/supprimer. Comment puis-je modifier ma méthode Delete pour refléter ces scénarios? S'il vous plaît?

Répondre

1

Vous avez raison. La suppression consiste simplement à lier Attach et à définir l'état sur Deleted - c'est la seule façon dont ObjectContext (enveloppé dans DbContext) peut savoir qu'il doit supprimer un objet.

Je suppose que vous pouvez essayer d'utiliser la nouvelle fonction CTP5 de DbSet-Local et essayer de trouver une entité attachée avec le même identifiant d'abord:

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

Salut Ladislav, qu'entendez-vous par Supprimer joint ou Supprimer entité? Comment implémenter les deux ??? – IamStalker

Questions connexes