LINQ与3层

时间:2009-05-28 05:21:39

标签: linq .net-3.5 c#-3.0 3-tier

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

}

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

2 个答案:

答案 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的良好实践。

查看ScottGu's blog for a quick q&a and basics on linq

答案 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();
    }
}