2012-12-13 2 views
1

У меня есть 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 и игнорировать его, если он уже существует? Если нет, то какова наилучшая практика для такого типа проблем?

ответ

0

Я считаю, что нет необходимости прикреплять объекты Person, если они уже существуют.

Что бы я делал, это цикл через объекты Person API и сравнить с EF DbContext.

var dbPerson = MyMovieContext.Persons.Where(x => x.ID == myPersonID).SingleOrDefault(); 

Если вы не нашли соответствия, затем Add. Если вы найдете совпадение, замените ссылку на Character на Entity из DbContext.

+0

Это работает практически для каждого сценария. Есть несколько фильмов, где человек может играть более чем одну роль. Если они не существуют в базе данных, я все равно получаю нарушение первичного ключа, потому что, когда он добавляет каждого человека из фильма, он вставляет person1 из character1, затем пытается вставить person1 из character2, но так как person1 теперь существует в db, выдает исключение. Есть предположения? – bflemi3

+0

После того, как вы вставляете person1 при обработке символа1, он должен извлекать person1 из контекста, когда вы обрабатываете символ2. возможно, вы проверяете, существует ли человек в неправильной точке вашего кода? –

+0

Но person1 не будет существовать в базе данных до тех пор, пока изменения не будут выполнены ('SaveChanges()'). – bflemi3

0

Если вы используете API-интерфейс DbContext, вы можете использовать метод расширения AddOrUpdate. Давайте предположим, что вы получили список или лицо, то вы можете сделать:

context.Persons.AddOrUpdate(persons.ToArray()); 

Вы, вероятно, сделать это для каждого элемента модели (persons, является лицом пункта), а затем создать Character объектов с Person и Movie объекты прилагаются.

Отметьте, что AddOrUpdate только добавляет или обновляет в контексте. Только SaveChanges заносится в базу данных.

Смежные вопросы