1

我正在使用 C# 和实体框架代码优先开发 WCF Rest 服务。

我有一个User包含 10 列的表,但这是所需列的 JSON 表示:

{
    "Name": "user_1",
    "Active": true,
    "Gender": 1,
    "Email": "email_1@hotmail.com",
    "Birthday": "02/07/1971",
    "City": "city_1",
    "Country": "country_1"
}

这就是我更新Userusing的方式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."}

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

4

1 回答 1

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;
于 2013-09-27T07:04:53.270 回答