У меня есть json-объект Movies
, который я передаю своему контроллеру.Вставка нового объекта со многими отношениями в Entity Framework
{data : [{
Id: 12345,
Title: 'Movie1',
Year: 2010,
Character: [{
Name: 'Character1',
Person: { Id: 1, Name: 'Person1' }
},{
Name: 'Character2',
Person: { Id: 2, Name: 'Person2' }
}]
}]}
модели связывания работает нормально, но у меня вопрос, вставляя каждый Movie
в базу данных с помощью Entity Framework 5. Я получаю первичный ключ нарушения, когда каждый Person
фильма вставляется.
Я понимаю, почему это происходит. Некоторые люди уже существуют в базе данных при добавлении нового Movie
, чтобы произошло нарушение. Идентификатор для каждого человека не генерируется автоматически. Я использую идентификатор, который я получаю от api, с которого я получаю информацию.
A Movie
имеет отношения «многие ко многим» с Person
, с Character
является мостом между двумя.
public class Movie {
public int Id { get; set; }
public string Title { get; set; }
public int? Year { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Movie() {
Characters = new HashSet<Character>();
}
}
public class Character {
public string Name { get; set; }
public virtual Movie Movie { get; set; }
public virtual Person Person { get; set; }
}
public class Person {
public int Id { get;set; }
public string Name { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Person() {
Characters = new HashSet<Character>();
}
}
Мой вопрос ... Я знаю, что могу петлю через каждый Person
объект и Attach()
если он существует или Add()
, если он не делает. Может ли Entity Framework автоматически обрабатывать вставку нового Person
и игнорировать его, если он уже существует? Если нет, то какова наилучшая практика для такого типа проблем?
Это работает практически для каждого сценария. Есть несколько фильмов, где человек может играть более чем одну роль. Если они не существуют в базе данных, я все равно получаю нарушение первичного ключа, потому что, когда он добавляет каждого человека из фильма, он вставляет person1 из character1, затем пытается вставить person1 из character2, но так как person1 теперь существует в db, выдает исключение. Есть предположения? – bflemi3
После того, как вы вставляете person1 при обработке символа1, он должен извлекать person1 из контекста, когда вы обрабатываете символ2. возможно, вы проверяете, существует ли человек в неправильной точке вашего кода? –
Но person1 не будет существовать в базе данных до тех пор, пока изменения не будут выполнены ('SaveChanges()'). – bflemi3