我正在开发一个使用C#和实体框架代码优先的WCF Rest服务。
我有一个包含10列的表User
,但这是所需列的JSON表示:
{
"Name": "user_1",
"Active": true,
"Gender": 1,
"Email": "email_1@hotmail.com",
"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."}
我是否必须发送所有必填字段才能更新一个?
答案 0 :(得分:1)
没有
您无需发送所有字段。 您可以使用此代码(当然会进行调整)
在我的通用存储库中,我这样做
DbSet dbSet = Context.Set<TEntity>();
dbSet.Attach(entity);
Context.Entry<TEntity>(entity).Property(e => e.YourPropertyName).IsModified = true;
Context.SaveChanges()
这表示只修改了该属性,并且不会尝试更新其余属性。如果列数随每个请求而变化,则需要编写一些逻辑来满足该要求。
神奇在于这一行
Context.Entry<TEntity>(entity).Property(e => e.YourPropertyName).IsModified = true;
也可以像
一样使用Context.Entry<TEntity>(entity).Property("YourPropertyName").IsModified = true;