Правильно ли я подхожу к этому, и если да, то как мне обойти это исключение?
Я полагаю, эта часть вашего кода загружает весь узел из базы данных, чтобы найти DocumentID:
int docID = noteRepository.Find(note.NoteID).DocumentID;
В таком случае ваш InsertOrUpdate не может взять ваш узел и присоединить его к контексту с измененным состоянием, потому что у вас уже есть заметка с тем же ключом в контексте. Распространенным решением является использование этого:
objectContext.NoteSet.ApplyCurrentValues(note);
objectContext.SaveChanges();
Но для редактирования я не могу использовать его, поскольку злоумышленник может предоставить DocumentID, к которому у него есть доступ, и, таким образом, отредактировать заметку, которой он не владеет.
В таком случае вы должны добавить некоторую безопасность. Вы можете добавить любые данные в скрытые поля на своей странице, но те данные, которые не должны быть изменены клиентом, должны содержать дополнительную защиту. Например, второе скрытое поле с подписью, вычисленной на сервере, или хэшем соленого значения, вычисленным на сервере. Когда данные возвращаются в следующем запросе к серверу, он должен пересчитать и сравнить сигнатуру / хэш с той же солью и проверить, что переданное значение и вычисленное значение совпадают. Конечно, клиент не должен знать секрет, который вы используете для вычисления подписи или соли, используемой в хэше.
Я прочитал, что мне просто нужно иметь репозиторий Document в качестве совокупности и потерять репозиторий Note, но я не уверен, поможет ли это / как это.
Это более чистый способ использования репозиториев, но он не поможет вам с вашей конкретной ошибкой, потому что вам все еще понадобятся Note
и DocumentId
.