Доброго времени суток.
На фронте собирается из данных/редактируется объект подобного вида:
{
"author": {
"id": 119,
"displayName": "System"
},
"modify": {
"id": 119,
"displayName": "System"
},
"chapters": {
"chapterList": [{
"author": {
"id": 119,
"displayName": "System"
},
"modify": {
"id": 119,
"displayName": "System"
},
"id": 99,
"creationDate": "2018-06-27T10:50:27.75+03:00",
"modifyDate": "2018-06-27T10:50:27.75+03:00",
"title": "chapter 3"
},
{
"author": {
"id": 119,
"displayName": "System"
},
"modify": {
"id": 119,
"displayName": "System"
},
"id": 97,
"creationDate": "2018-06-27T10:50:27.75+03:00",
"modifyDate": "2018-06-27T10:50:27.75+03:00",
"title": "Chapter 1"
}],
"Id": 37
},
"id": 58,
"createDate": "2018-06-27T10:50:27.79+03:00",
"modifyDate": "2018-06-27T11:03:07.55+03:00",
"title": "Project 1"
}
На бэке при
public void Endpoint(Project project){
dbContext.Projects.Attach(project);
dbContext.SaveChanges();
}
на этапе атача вылетает эксэпшен о дублировании primary keys, при попытке приатачить к контексту данных из полей author/modify, вложенных сущностей, что вполне логично, т.к. зачасую они пересекаются.
Собственно вопрос как быть?
Я пока что вижу следующий сценарий:
Перед атачем рутовой сущности пробегать по всем уровням иерархии и заменять данные на данные из контекста, получая их из на лету, и заменяя значения полей/пропертей на значения из полученной сущности. Но в данном решении меня смущает как скажется на производительности эта тонна кода + вагон запросов к базе.
Или есть какое более элегантное решение, которое я тупо не вижу?