我正在尝试用3层方法编程。所以我创建了一个值对象层,我创建了一个像这样的用户对象值:
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();
}
}
因此,在另一个业务层中,我想创建一个可以在数据库中编辑我的记录的方法。我将用户值对象传递给Business层,我的Business层通过以下函数执行此操作:
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;
}
我想在没有Select查询的情况下编辑我的记录。我只想将我的新用户值对象传递给我的编辑功能,我的函数只是调用submit.change(); 一切都没问题;
答案 0 :(得分: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)