检查各个字段以查找EntityState中的更改

时间:2012-03-07 21:11:23

标签: c# asp.net-mvc-3 entity-framework

在我们的数据库中,我们有一个用户。用户可以具有与其相关联的某些元数据(如他们的位置,年龄等)。除此之外,他们还有个人资料图片。 用户可以随时编辑任何这些内容。

enter image description here

我们遇到的问题是,当用户去编辑他们的信息但他们没有选择图像时 - 先前的图像被删除(空)。

我认为当我们去保存修改后的用户时,我们应该可以说if(user.profileImage == null) don't save it

我认为这将在我们的用户存储库中发挥作用,该存储库使用以下代码:

public void SaveUser(Domain.Entities.User user)
        {
            if (user.UserId == 0)
            {
                context.Users.Add(user);
            }
            else
            {
                context.Entry(user).State = EntityState.Modified;
                //The logic would be here
            }
            context.SaveChanges();
        }

然而,我似乎无论我们尝试什么它都行不通。

所以我的问题是:有没有办法检查单个字段的更改而不是整个EntityState?

2 个答案:

答案 0 :(得分:0)

是的,有办法:

context.Users.Attach(user);
context.Entry(user).Property(u => u.Location).IsModified = true;
context.Entry(user).Property(u => u.Age).IsModified = true;
// etc.

请注意,一旦该属性被标记为已修改,您就无法将IsModified设置为false。所以,像这样......

context.Entry(user).State = EntityState.Modified;
context.Entry(user).Property(u => u.Image).IsModified = false;

... 不起作用

修改备用解决方案:

public void SaveUser(Domain.Entities.User user)
{
    if (user.UserId == 0)
    {
        context.Users.Add(user);
    }
    else
    {
        var userInDb = context.Users.Single(u => u.UserId == user.UserId);

        if (user.profileImage == null)
            user.profileImage = userInDb.profileImage;

        context.Entry(userInDb).CurrentValues.SetValues(user);
    }
    context.SaveChanges();
}

如果用户没有发布新图像(= profileImage),这会使user.profileImage == null的值保持在数据库中,否则会保存新图像。

答案 1 :(得分:0)

我最终在会话中存储了图像数据,然后如果图像上传为空,我只需将会话属性插入到我的图像中,如果留空则有效地保留旧图像。

Session["image"] = productService.GetProduct(id).Image;

然后在帖子中我说...

if (image != null)
                {
                    product.ImageType = image.ContentType;
                    product.Image = new byte[image.ContentLength];
                    image.InputStream.Read(product.Image, 0, image.ContentLength);
                }
                else
                {
                    product.Image = (byte[])Session["image"];
                }