2012-09-04 2 views
0

실패 내 기지 :SaveChanges를 여기

그리고 그것은 하나의 영화 (ID를 외부의 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를 입력하려고하기 때문에 erroring인가? 이름이 고유해야한다는 것은 나타나지 않습니다. – dcreight

답변

1

Kind이 DB에 이미 있는지 확인해야합니다. 예인 경우 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

아하가 아니기 때문에 실제로 응답을 얻으려는 시도가있었습니다. 사실 내 말이 무슨 의미인지. –