J'ai trouvé beaucoup de questions ici sur SO et des articles partout sur Internet, mais aucun n'a vraiment abordé mon problème.Entity Framework - Mettre à jour des entités sans Id
Mon modèle ressemble à ceci (je rayé toutes les propriétés non essentielles): alt text http://i47.tinypic.com/244p6qh.jpg
Tous les jours ou si « Play » est mis à jour (via un fichier XML contenant les informations).
internal Play ParsePlayInfo(XDocument doc)
{
Play play = (from p in doc.Descendants("Play")
select new Play
{
Theatre = new Theatre()
{
//Properties
},
//Properties
LastUpdate = DateTime.Now
}).SingleOrDefault();
var actors = (from a in doc.XPathSelectElement(".//Play//Actors").Nodes()
select new Lecturer()
{
//Properties
});
var parts = (from p in doc.XPathSelectElement(".//Play//Parts").Nodes()
select new Part()
{
//Properties
}).ToList();
foreach (var item in parts)
{
play.Parts.Add(item);
}
var reviews = (from r in doc.XPathSelectElement(".//Play//Reviews").Nodes()
select new Review
{
//Properties
}).ToList();
for (int i = 0; i < reviews.Count(); i++)
{
PlayReviews pR = new PlayReviews()
{
Review = reviews[i],
Play = play,
//Properties
};
play.PlayReviews.Add(pR);
}
return play;
}
Si j'ajoute ce « jeu » via Ajouter() tous les ChildObject de jeu sera inséré - peu importe si certains existent déjà. Puisque j'ai besoin de mettre à jour des entrées existantes, je dois faire quelque chose à ce sujet. Je suppose que le problème ici est que je n'ai aucun Id dans le XML que ce soit.
Pour autant que je peux dire que j'ai les options suivantes:
- ajouter/mettre à jour les entités enfant dans mes PlayRepositories Add-Méthode
- restructuration et récrire ParsePlayInfo() pour obtenir toutes les entités enfant d'abord, ajouter ou mettre à jour eux et puis créer un nouveau jeu. Le seul problème que j'ai ici est que je voulais ParsePlayInfo() pour être persistance ignorant, je pouvais travailler autour de ce par
- création de plusieurs méthodes parse (par exemple ParseActors()) et les affecter à jouer dans mon contrôleur (j'utilise ASP.net MVC) après tout a été analysé et ajouté
Actuellement, je suis l'option 1 de mise en œuvre - mais il se sent mal.
Ce que je veux faire est de mettre à jour les entités qui sont déjà dans la base de données et d'en insérer de nouvelles qui ne le sont pas. Dois-je appeler SaveChanges() avant de joindre/ajouter un jeu? Il doit y avoir une solution (relativement) facile. J'apprécierais que quelqu'un puisse me guider dans la bonne direction sur celui-ci.
Non, vous n'obtiendrez pas 11 entrées pour FirstEntityType, juste une dans votre base de données. Tant que vous êtes dans un ObjectContext, les identités sont préservées lorsque vous ajoutez un objet au contexte. Mais lorsque vous exécutez ce code une seconde fois (dans un nouveau contexte), vous obtiendrez en effet un second FirstEntityType (ou une exception de dababase lorsque FirstEntityType.id est une clé primaire non auto-incrémentée). Donc: Entity Framework dit: "Ce sont les mêmes!", Mais pas grâce au même id-champ mais parce que AddObject a créé un EntityKey (temporaire) qui identifie l'objet de façon unique dans un ObjectContext. – Slauma
Je voudrais avoir toujours ce code parce que je faisais quelque chose comme ça et a fini avec beaucoup d'entrées. Et puisque tout était joliment enveloppé dans un contexte {), je suis presque sûr d'avoir utilisé le même contexte. Peut-être que c'était quelque chose de différent qui a causé ce comportement ou j'ai foiré quelque part. J'étais vraiment frustré après un moment et je voulais que le travail soit terminé. Peut-être que je vais faire quelques tests si j'ai le temps. Et agréable de voir que quelqu'un a tout lu :) –