У меня есть проект, который широко использует Entity Framework. И все работает отлично.Entity Framework не обновляет существующий связанный объект
Однако есть одно обновление, которое я пытаюсь сделать, и оно не обновляется, и не возникает ошибка.
Основным процессом является то, что я беру существующий объект, работаю с ним, чтобы создать новый (и другой тип) объекта. Новый объект сохраняет просто отлично, но существующего нет.
Обычно, когда я сталкивался с этим, это означает, что объект не привязан к контексту. Тем не менее, это так, и я попытался присоединить его снова, а также «Добавить», но мне не повезло.
if (fileRowEntity != null)
{
this.Context.FileRowEntities.Attach(fileRowEntity);
fileRowEntity.FileRowStatusId = (int)FileRowStatus.Converted;
fileRowEntity.EdiDocument = ediDocument;
}
ediDocument.InsertedDate = DateTime.Now;
ediDocument.EdiDocumentGuid = Guid.NewGuid();
ediDocument.DocumentMetatdata = null;
this.Context.EdiDocuments.Add(ediDocument);
var count = this.Context.SaveChanges();
The ediDocument
сохраняется, но fileRowEntity
не сохраняется.
Я разрываю волосы, пытаясь понять это. Я попробовал второй явно сэкономить на fileRowEntity
, но он возвращается с нулевыми изменениями спасенных:
if (fileRowEntity != null)
{
fileRowEntity.EdiDocumentId = ediDocument.EdiDocumentId;
fileRowEntity.Column100 = "X";
this.Context.FileRowEntities.Attach(fileRowEntity);
count = this.Context.SaveChanges();
}
count
всегда равна нулю, а база данных не обновляется.
Я не знаю, что еще попробовать отладить.
Прикрепление объекта не помечено как измененное ... вы пробовали 'Context.Entry (fileRowEntity) .State = EntityState.Modified;'? (нет необходимости прикреплять его, это будет прикреплять объект, если он также отсоединен). Если объект не является прокси-сервером и/или он был загружен заранее, EF не будет знать, что в него были внесены изменения, если вы не сообщите об этом, поэтому он не будет делать никаких обновлений. Явное указание на это как «Модифицированное» должно работать. – Jcl
Спасибо. Да, это действительно делает работу сохранения. Означает ли это, что сущность фактически не в том же контексте? Насколько я могу судить, один и тот же менеджер сущностей используется для извлечения сущностей в качестве их сохранения. –
Когда объект загружается из базы данных, его исходные значения (по мере их восстановления) сохраняются в контексте (вы можете проверить их в 'Context.Entry (entity) .OriginalValues') ... когда dbcontext проверяет его (вызывая 'DetectChanges'), он сохраняет новые значения (вы можете проверить их в' Context.Entry (entity) .CurrentValues'), и если какой-либо из них будет изменен, тогда при обновлении изменений генерируется 'UPDATE' , Поэтому, если исходный объект был извлечен из базы данных по тому же самому контексту, то да, он должен обнаружить изменения и сохранить изменения. – Jcl