LINQ与3层

Moh*_*san 2 linq 3-tier .net-3.5 c#-3.0

目前我正在设计我的学位项目.几天前我开始学习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();
    }

}
Run Code Online (Sandbox Code Playgroud)

以上方法调用序列是否正常?

Eli*_*ver 5

Linq To SQL非常适合单层设计.对于断开连接的模型多层环境来说并不是那么好.

上面的代码只将一个User插入数据库.如果启动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,...)
Run Code Online (Sandbox Code Playgroud)

要更新用户,您的代码应该看起来像

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
}
Run Code Online (Sandbox Code Playgroud)

每次执行一个工作单元时,都应该确保使用数据库合同.(因为默认情况下使用事务的数据库上下文,这可能会变得很难看,不要为构建数据库上下文而烦恼!)

通常,当您使用多层环境时,您将通过线路(网络)传递它们时创建单独的POCO.

NCommon是Linq to Sql的一个很好的抽象,应该处理业务验证和规则.

注意.在数据库中散列密码值的良好做法.

查看ScottGu的博客,了解linq的快速问答和基础知识