Ось моя база:
І що він містить один фільм (ідентифікатори надходять із зовнішнього 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();
Як я можу уникнути цього винятку?
Відповіді:
1 для відповіді № 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 для відповіді № 2
Отримайте вид фільму замість того, щоб створювати його щоразу. Або це очевидно?