EF - дублирование записей при вставке
От: α Российская Империя  
Дата: 04.12.15 07:23
Оценка:
Пусть у нас есть такая простая структура классов

public class Порода
{
  [Key]
  public string Название {get;set;}
}

public class Собака
{
  [Key]
  public string Кличка {get;set;}
  public Порода Порода {get;set;}
}


Дальше:

var шарик = new Собака { Кличка = "Шарик", Порода = new Порода { "Овчарка" } };
var тузик = new Собака { Кличка = "Тузик", Порода = new Порода { "Овчарка" } };
context.Собаки.Add(шарик);
context.Собаки.Add(тузик);
context.SaveChanges();


В этом примере в контекст добавляются две собаки одной породы, при этом название породы — первичный ключ.
Но объект класса Порода в контекст добавляется не явно, а через навигационное свойство объекта класса Собака.
Поэтому получается, что в контекст попадают два объекта Порода с одинаковым первичным ключом. Сохранения при этом не происходит по понятным причинам, СУБД ругается на дублирование первичного ключа в таблице "Порода".

Конечно правильнее было бы сделать так: сперва создать объект класса Порода, потом сослаться на него из обоих собак, но я так сделать не могу, потому что по факту эти собаки у меня получаются из десериализации XML такой структуры:

<Собака>
  <Кличка>Шарик</Кличка>
  <Порода>
    <Название>Овчарка</Название>
  </Порода>
</Собака>
<Собака>
  <Кличка>Тузик</Кличка>
  <Порода>
    <Название>Овчарка</Название>
  </Порода>
</Собака>


Пример понятное дело сильно упрощен, по факту в реальной XML-схеме около 300 классов и разрулить все подобные ссылки руками ну чрезвычайно тяжело.

Можно ли как-то подкрутить EF так, чтобы она понимала, что запись с таким-то первичным ключом не нужно вставлять дважды?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.