在我们的数据库中,我们有一个用户。用户可以具有与其相关联的某些元数据(如他们的位置,年龄等)。除此之外,他们还有个人资料图片。 用户可以随时编辑任何这些内容。
我们遇到的问题是,当用户去编辑他们的信息但他们没有选择图像时 - 先前的图像被删除(空)。
我认为当我们去保存修改后的用户时,我们应该可以说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?
答案 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"];
}