Entity Framework 4, objets POCO et ASP.Net MVC2. J'ai une relation plusieurs à plusieurs, disons entre les entités BlogPost et Tag. Cela signifie que dans ma classe POCO BlogPost générée par T4, j'ai:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Je demande un BlogPost et les balises associées à partir d'une instance de l'ObjectContext et je l'envoie à une autre couche (vue dans l'application MVC). Plus tard, je récupère le BlogPost mis à jour avec des propriétés modifiées et des relations modifiées. Par exemple, il avait des balises "A", "B" et "C", et les nouvelles balises sont "C" et "D". Dans mon exemple particulier, il n'y a pas de nouvelles balises et les propriétés des balises ne changent jamais, donc la seule chose qui devrait être enregistrée est les relations modifiées. Maintenant, je dois enregistrer cela dans un autre ObjectContext. (Mise à jour: maintenant, j'ai essayé de le faire dans la même instance de contexte et j'ai également échoué.)
Le problème: je ne peux pas le faire enregistrer correctement les relations. J'ai essayé tout ce que j'ai trouvé:
- Controller.UpdateModel et Controller.TryUpdateModel ne fonctionnent pas.
- Récupérer l'ancien BlogPost du contexte puis modifier la collection ne fonctionne pas. (avec différentes méthodes à partir du point suivant)
- Cela fonctionnerait probablement, mais j'espère que ce n'est qu'une solution de contournement, pas la solution :(.
- J'ai essayé les fonctions Attach / Add / ChangeObjectState pour BlogPost et / ou Tags dans toutes les combinaisons possibles. Échoué.
- Cela ressemble à ce dont j'ai besoin, mais cela ne fonctionne pas (j'ai essayé de le réparer, mais je ne peux pas pour mon problème).
- J'ai essayé ChangeState / Add / Attach / ... les objets de relation du contexte. Échoué.
«Ne fonctionne pas» signifie dans la plupart des cas que j'ai travaillé sur la «solution» donnée jusqu'à ce qu'elle ne produise aucune erreur et enregistre au moins les propriétés de BlogPost. Ce qui se passe avec les relations varie: généralement, les balises sont ajoutées à nouveau à la table des balises avec de nouveaux PK et le BlogPost enregistré fait référence à celles-ci et non à celles d'origine. Bien sûr, les balises renvoyées ont des PK, et avant les méthodes de sauvegarde / mise à jour, je vérifie les PK et ils sont égaux à ceux de la base de données, donc EF pense probablement qu'il s'agit de nouveaux objets et que ces PK sont ceux temporaires.
Un problème que je connais et qui pourrait rendre impossible la recherche d'une solution simple automatisée: lorsque la collection d'un objet POCO est modifiée, cela devrait se produire par la propriété de collection virtuelle mentionnée ci-dessus, car alors l'astuce FixupCollection mettra à jour les références inversées à l'autre extrémité de la relation plusieurs-à-plusieurs. Cependant, lorsqu'une vue «renvoie» un objet BlogPost mis à jour, cela ne se produit pas. Cela signifie qu'il n'y a peut-être pas de solution simple à mon problème, mais cela me rendrait très triste et je détesterais le triomphe EF4-POCO-MVC :(. Cela signifierait également qu'EF ne peut pas faire cela dans l'environnement MVC, quel que soit le cas Les types d'objets EF4 sont utilisés: (. Je pense que le suivi des modifications basé sur les instantanés devrait découvrir que le BlogPost modifié a des relations avec des balises avec des PK existants.
Btw: Je pense que le même problème se produit avec les relations un-à-plusieurs (google et mon collègue le disent). Je vais essayer à la maison, mais même si cela fonctionne, cela ne m'aide pas dans mes six relations plusieurs à plusieurs dans mon application :(.