asp.net-mvc – 存储库模式中的纯POCO实体更新问题
发布时间:2020-05-25 04:45:04 所属栏目:asp.Net 来源:互联网
导读:我的UserRepository中有一个问题,我想在其中更新用户.除非指定,否则我不希望更新某些字段,例如密码.例如,当我将用户从视图传递到服务器到存储库时,它会向用户发送空密码或空密码字符串.这个null被写入数据库(我不想要). 我该如何处理这种情况? 域 public cla
|
我的UserRepository中有一个问题,我想在其中更新用户.除非指定,否则我不希望更新某些字段,例如密码.例如,当我将用户从视图传递到服务器到存储库时,它会向用户发送空密码或空密码字符串.这个null被写入数据库(我不想要). 我该如何处理这种情况? 域 public class User
{
public int UserId { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
知识库 public User Save(User user)
{
if (user.UserId > 0)
{
User dbUser = context.Users.FirstOrDefault(u => u.UserId == user.UserId);
//What do I do here?
}
context.Users.AddObject(user);
context.SaveChanges();
return user;
}
让我们说在这种情况下,我的视图允许我只更改电子邮件,因此唯一被发送回Save()方法的是:user.UserId和user.Email,而user.Password为null.在我的情况下,数据库抛出错误,因为密码应该可以为空. 解决方法分离的POCO场景(更新前不会从DB加载用户):您可以有选择地说明必须更新哪些属性: public User Save(User user)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(user);
entry.SetModifiedProperty("Email");
}
context.SaveChanges();
return user;
}
您还可以创建Save方法的两个重载.首先将更新整个对象,第二个将仅更新显式选择的属性: public User Save(User user)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
context.ObjectStateManager.ChangeObjectState(user,EntityState.Modified);
}
context.SaveChanges();
return user;
}
public User Save(User user,IEnumerable<Expression<Func<User,object>>> properties)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(user);
foreach(var selector in properties)
{
string propertyName = PropertyToString(selector.Body);
entry.SetModifiedProperty(propertyName);
}
}
context.SaveChanges();
return user;
}
// Doesn't work for navigation properties!
private static string PropertyToString(Expression selector)
{
if (selector.NodeType == ExpressionType.MemberAccess)
{
return ((selector as MemberExpression).Member as PropertyInfo).Name;
}
throw new InvalidOperationException();
}
您将以这种方式调用第二个重载: userRepository.Save(user,new List<Expression<Func<User,object>>>
{
u => u.Email
});
附加方案(您将在更新前从DB加载用户): 您可以修改Save方法以接受委托,以便您可以控制如何执行更新: public User Save(User user,Action<User,User> updateStrategy)
{
if (user.UserId > 0)
{
User dbUser = context.Users.FirstOrDefault(u => u.UserId == user.UserId);
updateStrategy(dbUser,user);
}
else
{
// New object - all properties should be saved
context.Users.AddObject(user);
}
context.SaveChanges();
return user;
}
您将以这种方式调用方法: var user = GetUpdatedUserFromSomewhere();
repository.Save(user,(dbUser,mergedUser) =>
{
dbUser.Email = mergedUser.Email;
});
无论如何,尽管有我的例子,你一定要考虑Darin的帖子和特殊的ModelViews进行更新. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在ASP.NET菜单控件中设置item.selected
- asp.net – 保持当前的jQuery标签跨回发?
- asp.net-mvc-3 – 在ASP.NET MVC3中的自定义授权属性中使用
- asp.net – 网络应用程序项目v.s.网站项目
- asp.net-mvc – ASP.NET MVC 4在调试模式下捆绑js文件
- asp.net-mvc-4 – 带有返回URL的注销链接(OAuth)
- asp.net-mvc – 创建自定义RouteBase类
- asp.net-mvc – 如何在asp.net C#中从http重定向到https并将
- ASP.NET如何渲染控件到HTML?
- asp.net-web-api – 密码更改时如何使OAuth令牌无效?
推荐文章
站长推荐
- asp.net-mvc – Gzip压缩无法运行ASP.net MVC5
- .net – MultipartFormDataStreamProvider vs Ht
- asp.net – 什么导致页面呈现慢?
- asp.net – 为什么当StateProvider不是InProc时,
- asp.net-mvc-3 – ASP.NET MVC:如何返回304“未
- 页面生成时间 – ASP.Net MVC
- asp.net-mvc – 用于电子邮件创建和发送的ASP.Ne
- asp.net-mvc – 强大类型的ASP.NET MVC与ADO.NET
- asp.net-mvc – ASP.net MVC3 – 使用Ajax回发的
- asp.net – 如何直接在.aspx页面中访问web.confi
热点阅读
