DbEntityValidationException: Должен ли я отправлять все обязательные поля для обновления только одного?

Я разрабатываю службу WCF Rest с С# и Entity Framework Code First.

У меня есть таблица User с 10 столбцами, но это представление JSON для необходимых столбцов:

{
 "Name": "user_1",
 "Active": true,
 "Gender": 1,
 "Email": "[removed_email]",
 "Birthday": "02/07/1971",
 "City": "city_1",
 "Country": "country_1"
}

Вот как я обновляю User с использованием Entity Framework Code First:

private User InsertOrUpdateUser(User user)
{
 try
 {
 using (var context = new MyContext())
 {
 context.Entry(user).State = user.UserId == 0 ?
 EntityState.Added :
 EntityState.Modified;
 context.SaveChanges();
 }
 }
 catch (Exception ex)
 {
 ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError;
 ctx.SuppressEntityBody = true;
 }

 return user;
}

Когда я отправил этого пользователя:

{
 "Name": "user_1-mod",
 "UserId": 1
}

Я получаю следующую ошибку:

[System.Data.Entity.Validation.DbEntityValidationException] =
{"Validation failed for one or more entities. See 'EntityValidationErrors' property for more details."}

Должен ли я отправлять все обязательные поля для обновления только одного?

1 ответ

Нет,

Вам не нужно отправлять все поля. Вы можете использовать этот код (с корректировками, конечно)

В моем общем хранилище я делаю это

DbSet dbSet = Context.Set<tentity>();
dbSet.Attach(entity);
Context.Entry<tentity>(entity).Property(e => e.YourPropertyName).IsModified = true;
Context.SaveChanges()
</tentity></tentity>

Это говорит о том, что только это свойство модифицировано и не будет пытаться обновить остальные. Если количество столбцов изменяется с каждым запросом, вам нужно будет написать некоторую логику, чтобы удовлетворить это.

Магия лежит в этой линии

Context.Entry<tentity>(entity).Property(e => e.YourPropertyName).IsModified = true;
</tentity>

Который также может быть использован как

Context.Entry<tentity>(entity).Property("YourPropertyName").IsModified = true;
</tentity>

licensed under cc by-sa 3.0 with attribution.