0

これが私の拠点です:

そして、1 つのムービーが含まれていること (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();

この例外を回避するにはどうすればよいですか?

4

2 に答える 2

1

KindDBにすでに存在するかどうかを確認できると思います。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();
于 2012-09-04T20:29:33.217 に答える
0

毎回作成するのではなく、映画の種類を取得します。それともそれは明らかですか?

于 2012-09-04T19:54:29.263 に答える