DbEntityValidationException:我是否必须发送所有必填字段才能更新一个?

时间:2013-09-27 05:43:32

标签: c# entity-framework

我正在开发一个使用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."}

我是否必须发送所有必填字段才能更新一个?

1 个答案:

答案 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;