2010-02-12 6 views
0

J'ai un problème avec un code simple, je suis en train de refactoriser du code existant de LINQ à SQL vers Entity Framework. Je teste mes arrêts et supprime, et la suppression est vraiment me casser les pieds:Suppression d'exception en utilisant Entity Framework (C#)

[TestMethod] 
public void TestSaveDelete() 
{ 
    ObjectFactory.Initialize(x => 
    { 
     x.For<IArticleCommentRepository>().Use<ArticleCommentRepository>(); 
    }); 

    PLArticleComment plac = new PLArticleComment(); 
    plac.Created = DateTime.Now; 
    plac.Email = "myemail"; 
    plac.Name = "myName"; 
    plac.Text = "myText"; 
    plac.Title = "myTitle"; 

    IArticleCommentRepository acrep = ObjectFactory.GetInstance<IArticleCommentRepository>(); 
    try 
    { 
     PortalLandEntities ple = new PortalLandEntities(); 
     int count = ple.PLArticleComment.Count(); 
     acrep.Save(plac); 
     Assert.AreEqual(ple.PLArticleComment.Count(), count + 1); 
     //PLArticleComment newPlac = ple.PLArticleComment.First(m => m.Id == plac.Id); 
     //ple.Attach(newPlac); 
     acrep.Delete(plac); 
     Assert.AreEqual(ple.PLArticleComment.Count(), count + 1); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

Chaque fois que je tente d'exécuter ce code, je reçois une exception dans la déclaration de suppression, me disant que ce ne est pas contenu dans le Note actuelle ObjectStateManager.Please que mes deux enregistrer et supprimer ressemble à ceci:

public void Delete(PLCore.Model.PLArticleComment comment) 
{ 
    using (PortalLandEntities ple = Connection.GetEntityConnection()) 
    { 
     ple.DeleteObject(comment); 
     ple.SaveChanges(); 
    } 
} 

public void Save(PLCore.Model.PLArticleComment comment) 
{ 
    using (PortalLandEntities ple = Connection.GetEntityConnection()) 
    { 
     ple.AddToPLArticleComment(comment); 
     ple.SaveChanges(); 
    } 
} 

et la thingy connexion:

public class Connection 
{ 
    public static PortalLandEntities GetEntityConnection() 
    { 
     return new PortalLandEntities(); 
    } 
} 

Toutes les idées sur ce que je pouvais faire pour le rendre w ork?

+0

C'est "Entity Framework", pas "Entity Model Framework". Aussi, je suggère de sortir de l'habitude d'utiliser ex.Message. Utilisez ex.ToString() à la place. –

Répondre

1

Vous ne pouvez pas charger une entité d'un ObjectContext (dans votre cas, un ObjectContext est une instance de PortalLandEntities), puis le supprimer d'un autre ObjectContext, à moins que vous détachez de la première et l'attacher à la seconde. Votre vie sera beaucoup, beaucoup plus simple si vous utilisez seulement un ObjectContext à la fois. Si vous ne pouvez pas faire cela, vous devez d'abord Detach puis Attach d'abord, tout en gardant la trace des entités qui sont connectés à ObjectContext.

Comment utiliser DI avec votre Connection: le rendre non-statique. Ensuite, utilisez un conteneur DI par demande.

public class Connection 
{ 
    private PortalLandEntities _entities; 

    public PortalLandEntities GetEntityConnection() 
    { 
     return _entities; 
    } 

    public Connection(PortalLandEntities entities) 
    { 
     this._entities = entities; 
    } 
} 

Ensuite, utilisez un conteneur DI. La plupart des gens le font via une usine de contrôleurs.

+0

Comment puis-je implémenter une nouvelle version de ma classe "Connection"? J'aime la structure qu'il a maintenant, puisque je peux changer la base de données seulement un endroit et surcharger le getConnection si nécessaire ... devrais-je faire un singleton? –

+0

Utilisez DI pour injecter une seule instance 'ObjectContext' par requête au lieu de la créer en interne. Notez que cela rend également votre classe plus testable. –

+0

Ok, je pense que tu m'as perdu. Comment pourrais-je faire cette DI? Pourriez-vous s'il vous plaît écrire la signature de la méthode? Comment puis-je résoudre mes "Enregistrer" et "Supprimer" alors, devraient-ils prendre le ObjectContect comme paramètre? (Je détesterais vraiment ça, je voudrais le garder invisible du client). Veuillez noter que j'utilise StructureMap comme mon CIO. –

Questions connexes