2014-02-21 132 views
2

我想在3层的方法来进行编程。所以我创建了一个价值对象层更新使用LINQ记录和我创建了一个用户对象的值是这样的:通过传递一个值对象

public class VOuser:MainClass 
{ 
    public string _username; 
    public string _password; 
    public string _email; 
    public string _mobile; 
    public DateTime _dateOfRegister; 
    public string _name; 
    public string _family; 

    public VOuser() 
    { 
     _BUuser=new BUUser(); 
    } 
    public EnumUserPermission Permission 
    { 
     get { return _permission; } 
     set { _permission = value; } 
    } 

    public string Username 
    { 
     get { return _username; } 
     set { if(value=="")message("لطفا نام کاربری را وارد کنید"); _username = value; } 
    } 

    public string Password 
    { 
     get { return _password; } 
     set { if (value == "")message("لطفا کلمه عبور را وارد کنید"); _password = value; } 
    } 

    public string Email 
    { 
     get { return _email; } 
     set { if (value == "")message("لطفا رایانامه را وارد کنید"); _email = value; } 
    } 

    public string Mobile 
    { 
     get { return _mobile; } 
     set { if (value == "")message("لطفا شماره موبایل را وارد کنید"); _mobile = value; } 
    } 

    public DateTime DateOfRegister 
    { 
     get { return _dateOfRegister; } 
     set { _dateOfRegister = DateTimeNow(); } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { if (value == "")message("لطفا نام را وارد کنید"); _name = value; } 
    } 

    public string Family 
    { 
     get { return _family; } 
     set { if (value == "")message("لطفا نام خانوادگی را وارد کنید"); _family = value; } 
    } 

    public void edit() 
    { 
     _BUuser._VOUser=this; 
     _BuUser.Edituser(); 
    } 
} 

所以和在另一个业务层中,我想创建一个可以在数据库中编辑我的记录的方法。我通过用户价值对象业务层和我的业务层通过下面的函数执行此操作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using novitiate.DataAccesslayer; 
using novitiate.ValueObjectLayer; 

namespace novitiate.BusinessLayer 
{ 
    public class BUUser:BuMainClass 
    { 
     protected DataAccesslayer.tblUser _userDA; 
     public ValueObjectLayer.VOuser _VOUser; 

    public BUUser() 
    { 
     _userDA=new tblUser(); 
    } 

    public bool AddUser() 
    { 
     _userDA.userName = _VOUser.Username; 
     _userDA.password = _VOUser.Password; 
     _userDA.email = _VOUser.Email; 
     _userDA.mobile = _VOUser.Mobile; 
     _userDA.dateOfRegister = _VOUser.DateOfRegister; 
     _userDA.name = _VOUser.Name; 
     _userDA.family = _VOUser.Family; 
     dbconnect.tblUsers.InsertOnSubmit(_userDA); 
     dbconnect.SubmitChanges(); 
     return true; 
    } 

    public bool Edituser() 
    { 
     _userDA.userName = _VOUser.Username; 
     _userDA.password = _VOUser.Password; 
     _userDA.email = _VOUser.Email; 
     _userDA.mobile = _VOUser.Mobile; 
     _userDA.dateOfRegister = _VOUser.DateOfRegister; 
     _userDA.name = _VOUser.Name; 
     _userDA.family = _VOUser.Family; 
     dbconnect.SubmitChanges(); 
     return true; 
    } 
} 

因此,我调用用户对象层的编辑功能。

我的问题是在编辑功能。你认为我使用的模型正在工作,或者我应该使用一些像这样的事情:

public bool Edituser() 
{ 
    var q = from i in dbconnect.tblUsers where i.userName == _VOUser.Username select i; 

    q.First().password = _VOUser.Password; 
    q.First().email = _VOUser.Email; 
    q.First().mobile = _VOUser.Mobile; 
    q.First().dateOfRegister = _VOUser.DateOfRegister; 
    q.First().name = _VOUser.Name; 
    q.First().family = _VOUser.Family; 
    dbconnect.SubmitChanges(); 
    return true; 
} 

我想编辑我的记录没有选择查询。我只想将我的NEW User值对象传递给我的Edit函数,而我的函数只是调用submit.change(); 而且每件事情都可以;

回答

3

让我们看看你的代码

public bool Edituser() 
{ 
    var q = from i in dbconnect.tblUsers 
      where i.userName == _VOUser.Username 
      select i; 

    q.First().userName = _VOUser.Username; 
    q.First().password = _VOUser.Password; 
    q.First().email = _VOUser.Email; 
    q.First().mobile = _VOUser.Mobile; 
    q.First().dateOfRegister = _VOUser.DateOfRegister; 
    q.First().name = _VOUser.Name; 
    q.First().family = _VOUser.Family; 
    dbconnect.SubmitChanges(); 
    return true; 
} 

这里会发生什么 - 每次在执行查询时调用First()。因此,您将查询定义为按名称选择用户。然后你查询第一个用户并设置它的名字(为什么?)。然后再次查询第一个用户并设置其密码。然后再次查询第一位用户并设置其电子邮件。等

你需要的是查询用户一次,然后对其进行更新和提交更改:

public bool Edituser() 
{ 
    var user = 
     dbconnect.tblUsers.SingleOrDefault(u => u.userName == _VOUser.Username); 

    if (user == null) 
     // throw exception 

    user.password = _VOUser.Password; 
    user.email = _VOUser.Email; 
    user.mobile = _VOUser.Mobile; 
    user.dateOfRegister = _VOUser.DateOfRegister; 
    user.name = _VOUser.Name; 
    user.family = _VOUser.Family; 
    dbconnect.SubmitChanges(); 
    return true; 
} 

注 - 您可以使用绘图工具来自动映射实体之间的性能。例如。 AutoMapper会为你做它:

public bool Edituser() 
{ 
    var user = 
     dbconnect.tblUsers.SingleOrDefault(u => u.userName == _VOUser.Username); 

    if (user == null) 
     // throw exception 

    Mapper.Map(_VOUser, user); 
    dbconnect.SubmitChanges(); 
    return true; 
} 

另外我想移动数据访问相关的操作分离类,像UserRepository。还有一件事对我来说很奇怪,那就是你的Edituser()不接受应该更新的用户。我倒是希望喜欢public bool Update(VOuser voUser)

+0

是的签名,这是我的错,但我只需要我的用户值对象映射到我的tbluser – SSC

+0

和我的问题是,我可以使用*** VAR用户= dbconnect.tblUsers.SingleOrDefault (u => u.userName == _VOUser.Username); ***此业务层中的查询 – SSC

+1

@SSC在业务层中有查询不是很好的主意 - 您应该将它们保留在数据访问层 –