2014-02-21 133 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在業務層中有查詢不是很好的主意 - 您應該將它們保留在數據訪問層 –