我在這裏發現了很多關於SO和文章的問題,但都沒有真正解決我的問題。實體框架 - 更新沒有Id的實體
我的模型看起來像這樣(我條紋所有非必要屬性): alt text http://i47.tinypic.com/244p6qh.jpg
每天左右的「PLAY」被更新(通過包含信息的XML文件)。
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;
}
如果我通過Add()添加這個「play」,每個Play對象的子對象都將被插入 - 無論是否已經存在。由於我需要更新現有的條目,所以我必須對此做些事情。我想這裏的問題是我在XML中沒有任何標識。
至於我可以告訴我有以下幾種選擇:
- 添加/更新的子實體在我 PlayRepositories添加法
- 重組和改寫 ParsePlayInfo(),以便讓所有的 子實體先添加或更新 他們和然後創建一個新的Play。 我這裏唯一的問題是, 我想ParsePlayInfo()是 持久性無知,我可以
- 創建多個 解析方法解決此 (如ParseActors()) ,並指定他們在玩我 控制器(我使用ASP.net MVC) 一切後,解析並加入
目前我實現選擇1 - 但感覺不對。
我想要做的是更新已經在數據庫中的實體,並插入新的實體。 在附加/添加遊戲之前,我必須調用SaveChanges()嗎?必須有一個(相對)簡單的解決方案。 我會很感激,如果有人能指導我在這一個正確的方向。
不,你不會得到11個FirstEntityType的條目,只有一個在你的數據庫中。只要你在一個ObjectContext內,當你添加一個對象到上下文時,身份就會被保留。但是,當您再次執行此代碼(在新的上下文中)時,您確實會得到第二個FirstEntityType(或者當FirstEntityType.id是非自動增量主鍵時,會發生dababase異常)。所以:實體框架實際上是這樣說的:「這些都是一樣的!」,但不是感謝相同的id字段,而是因爲AddObject創建了一個(臨時)EntityKey,它在一個ObjectContext中唯一標識該對象。 – Slauma 2010-06-16 00:48:23
我希望我仍然有這樣的代碼,因爲我正在做這樣的事情,並以許多條目結束。而且因爲一切都很好地包裝在使用(上下文){}我很確定我使用了相同的上下文。 也許這是不同的,導致這種行爲或我搞砸了某處。過了一段時間,我非常沮喪,希望完成這項工作。 也許我會做一些測試,如果我有時間。 很高興看到有人讀這一切:) – 2010-06-16 01:08:18