Пусть у нас есть такая простая структура классов
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 так, чтобы она понимала, что запись с таким-то первичным ключом не нужно вставлять дважды?