目前我正在设计我的学位课程。几天前我开始学习LINQ。我发现它很有意思并计划在我的项目中使用它,但现在我在某些方面感到困惑。
当我添加LINQ to SQL类时,它会自动为数据库中的每个表生成实体类。
假设我在数据库中有两个表:
用户
项目
UserProjects(联合表)
和一个联合表,表示哪个用户与哪个项目相关联。
LINQ to SQL类自动为我生成这三个类。现在我应该创建单独的(用户和项目)类作为业务对象还是使用这些自动生成的实体?
此外,要使用数据库功能,我们需要使用3层架构。我可以直接从我的BLL调用LINQ DAL方法,还是需要创建单独的DAL,它将调用LINQ DAL的方法?
class UserBLL
{
public void saveUser(String username, String password)
{
// here I am calling LINQ DAL from by BLL
UserDataContext db = new UserDataContext();
User u =new User {Username = username, Password = password};
db.user.InsertOnSubmit(u);
db.SubmitChanges();
}
}
以上方法调用序列是否正常?
答案 0 :(得分:5)
Linq To SQL非常适合单层设计。 断开模型或多层环境不太好。
以上代码仅将单个用户插入数据库。如果启动MSSQL SQL Server Profiler或将日志连接到visual studio中的输出。你应该看到
//Hookup the log to the output in visual studio
using (var db = new UserDataContext()) {
db.Log = Console.Out;
}
INSERT INTO User VALUES (value1, value2, value3,...)
要更新用户,您的代码应该查看类似
的内容public void UpdateUser(String username, String password, int userId)
{
using (var db = new UserDataContext()) {
//Get Row From Database Marching Id
var user = db.user.Single(p => p.Id = userId);
//Update Values
user.Username = username;
user.Password = password;
//Save To The Database
db.SubmitChanges();
}
}
//Get All Users From Database
public IEnumerable<User> GetAllUsers()
{
using (var db = new UserDataContext()) {
//Get Row From Database Matching Id
var users = from user in db.user
select user;
return users.ToList();
}
}
//To display the data just enumerate through the enumeration that is returned.
var users = BusinessInstance.GetAllUsers();
foreach (var user in users) {
//user is the current item
}
每次执行一个工作单元时,您应该确保使用数据库合同。 (因为默认情况下使用事务的数据库上下文,这可能会变得很难看,不用担心构建数据库上下文的性能!)
通常,当您使用多层环境时,您将通过线路(网络)传递它们时创建单独的POCO。
NCommon是Linq to Sql的一个很好的抽象,应该处理业务验证和规则。
请注意。它是数据库中hash password values的良好实践。
答案 1 :(得分:0)
我通常为每个BLL对象创建一个类范围的datacontext。
我还创建了2个构造函数,1个用于创建datacontext,另一个用于接受datacontext。第二个是我可以从其他BLL对象传递datacontext。
这允许您对可能来自2个不同BLL对象的对象执行数据库操作,同时仍保留良好的关注点分离。您还需要将datacontext公开为public readonly,以便可以传递它。
需要注意的是,不必明确地处理DataContext对象more info here。但基本上DataContext只会在BLL对象的生命周期内存在。如果您确实需要释放资源(即已完成跟踪更改),则可以明确处置它。
e.g。
public class UserBLL
{
private readonly UserDataContext context;
public UserBLL() : this(new UserDataContext())
{
}
public UserBLL(UserDataContext context)
{
this.context = context
}
public UserDataContext Context { get { return context; } }
public void saveUser(String username, String password)
{
// here i am callsing LINQ DAL from by BLL
User u = new User {Username = username, Password = password};
Context.Users.InsertOnSubmit(u);
Context.SubmitChanges();
}
}