I have found many questions here on SO and articles all over the internet but none really tackled my problem.
My model looks like this (I striped all non essential Properties):
Everyday or so "Play" gets updated (via a XML-file containing the information).
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;
}
If I add this "play" via Add() every Childobject of Play will be inserted - regardless if some exist already. Since I need to update existing entries I have to do something about that. I guess the problem here is that I have no Id in the XML whatsoever.
As far as I can tell I have the following options:
- add/update the child entities in my PlayRepositories Add-Method
- restructure and rewrite ParsePlayInfo() so that get all the child entities first, add or update them and then create a new Play. The only problem I have here is that I wanted ParsePlayInfo() to be persistence ignorant, I could work around this by
- creating multiple parse methods (eg ParseActors() ) and assign them to play in my controller (I'm using ASP.net MVC) after everything was parsed and added
Currently I am implementing option 1 - but it feels wrong.
What I want to do is update entities that are already in the database and insert new ones that aren't. Do I have to call SaveChanges() before I Attach/Add Play? There must be a (relatively) easy solution. I'd appreciate it if someone could guide me in the right direction on this one.