2012-09-04 56 views
0

這裏是我的基地:的SaveChanges失敗

而且它包含一個電影(IDS來自外部REST API):

Movie movie = Movie.CreateMovie(999, "MyFirstMovie"); 
movie.Kinds.Add(Kind.Create(123,"Adventure")); 
movie.Kinds.Add(Kind.Create(124,"Comic")); 
movie.Actors.Add(Person.Create(321,"John Wayne")); 
movie.Directors.Add(Person.Create(120,"John Woo")); 
_context.AddToMovies(movie); 
_context.SaveChanges(); 

現在,當我試圖插入一個新的電影,我經常得到一個異常,說我插入一個已經存在於基地的實體。

想我有另外一個 「冒險」 的電影:

// Here all data comes from an external source and have no control over it. 
using(Stream stream = myExternalStream) 
{ 
    Movie movie = Unserialize(stream); 
    _context.AddToMovies(movie); 
} 
// throws the exception because the kind "Adventure" already exists 
_context.SaveChanges(); 

我怎樣才能避免這種例外?

+0

難道示數,因爲你正在試圖進入同一KindID?它似乎沒有名稱需要是唯一的。 – dcreight

回答

1

我想你會檢查數據庫中是否已經存在Kind。如果是,請按照從數據庫加載的種類來替換movie.Kinds集合中的種類。如果沒有,保持反序列化的種類和創建一個新Kind實體,例如像這樣:

using(Stream stream = myExternalStream) 
{ 
    Movie movie = Unserialize(stream); 
    var newKindList = new List<Kind>(); 
    foreach(var kind in movie.Kinds) 
    { 
     var kindInDB = _context.Kinds 
      .SingleOrDefault(k => k.KindId == kind.KindId); 
     if (kindInDB != null) 
      newKindList.Add(kindInDB); 
     else 
      newKindList.Add(kind); 
    } 
    movie.Kinds = newKindList; 
    _context.AddToMovies(movie); 
} 
_context.SaveChanges(); 
0

檢索電影種類,而不是每次都創建它。或者是明顯的?

+0

是的,因爲反序列化時會自動完成,有些可能存在,有些不是 –

+0

啊哈,所以答案實際上是嘗試撤回並且只有在沒有時才創建。這實際上是我評論的意思。 –