Обновление определенных свойств объекта с использованием EF6 без загрузки всего объекта

#c# #.net #entity-framework #entity-framework-6

#c# #.net #entity-framework #entity-framework-6

Вопрос:

(Этот вопрос был задан на SO, и я прочитал большинство связанных сообщений и пытаюсь реализовать на основе предложений, но все еще не работает)

  • Я использую EF6 (не ядро EF)
  • Я также использую подход DB first. Итак, у нас есть .edmx объекты file и C #, созданные шаблоном edmx (не уверен, имеет ли это значение здесь)

Я хочу обновить определенные свойства объекта без загрузки всего объекта.

     private async Task Monitor()
    {
        var timeStamp = DateTime.UtcNow.AddHours(-8);
        var documents = await _dbContext.Documents
                        .Where(x => x.DocumentCreatedDateTime < timeStamp)
                        .Select(x => new
                        {
                            x.DocumentID,
                            x.DocumentCreatedDateTime,
                            x.ProcessStatusID,
                            ProcessStatus = x.ProcessStatus.ProcessStatusName,
                            x.CurrentErrors,
                            x.ModifiedDateTime,
                            x.VersionStamp                                
                        })
                        .ToListAsync();

        if (documents.Count == 0)
        {
            return;
        }

        foreach (var document in documents)
        {  
            var docEntity = new Document();

            docEntity.DocumentID = document.DocumentID;
            docEntity.CurrentErrors = "Document has error";
            docEntity.ProcessStatusID = (int)StatusEnum.Error;
            docEntity.ModifiedDateTime = DateTime.UtcNow;
            docEntity.VersionStamp = document.VersionStamp;

            _dbContext.Documents.Attach(docEntity);
            var entry = _dbContext.Entry(docEntity);
            entry.Property(p => p.CurrentErrors).IsModified = true;
            entry.Property(p => p.ProcessStatusID).IsModified = true;
            entry.Property(p => p.ModifiedDateTime).IsModified = true;
            entry.Property(p => p.VersionStamp).IsModified = true;
        }           

        await _dbContext.SaveChangesAsync().ConfigureAwait(false);
    }
  

Проблема
Объект document имеет несколько других свойств (столбцов), которые требуются в базе данных. Но этому конкретному процессу не требуется обновлять эти свойства. При SaveChanges() вызове я получаю EntityValidationErrors ошибку

Обновление 1
Я думаю, что могу сделать db.Configuration.ValidateOnSaveEnabled = false , но не уверен, что это правильный подход

Поле xxxxx является обязательным.

Комментарии:

1. Этот вопрос был задан на SO — Что это значит? Вы повторяете существующий вопрос?

2. не тот же, но похожий вопрос

3. Что ж, если вы можете убедиться, что обновления действительны, можно отключить проверку для одного конкретного SaveChanges вызова.

4. @LP13 Лучше использовать опцию EF SqlCommand.