asp.net-mvc – 存储库模式中的纯POCO实体更新问题

我的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进行更新.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: &#39; Style=&quot;position: relative&quot; AppendDataBoundItems=&quot;True&quot;&gt; (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke &#39;*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the &quot;Report Items&quot; section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating