@TAPAKAHATOP
Чпициалист с широким профилем.

Entity Framework: Как сохранить объект с большой вложенностью detached объектов?

Доброго времени суток.
На фронте собирается из данных/редактируется объект подобного вида:
{
	"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, вложенных сущностей, что вполне логично, т.к. зачасую они пересекаются.
Собственно вопрос как быть?
Я пока что вижу следующий сценарий:
Перед атачем рутовой сущности пробегать по всем уровням иерархии и заменять данные на данные из контекста, получая их из на лету, и заменяя значения полей/пропертей на значения из полученной сущности. Но в данном решении меня смущает как скажется на производительности эта тонна кода + вагон запросов к базе.
Или есть какое более элегантное решение, которое я тупо не вижу?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 1
@maltsever
Привет! А как насчёт получить сущность со всеми нужными Include (они нам всё равно для сравнения понадобятся), пробежаться по вложенным сущностям и листам, удалить ненужные, добавить новые и тд. И потом сохранить. Или есть какая-то подоплёка?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы