2012-09-04 36 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

啊哈,所以答案实际上是尝试撤回并且只有在没有时才创建。这实际上是我评论的意思。 –