2

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

}

上面的方法调用顺序好吗?

4

2 回答 2

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 的一个很好的抽象,应该处理业务验证和规则。

笔记。在数据库中散列密码值是一种很好的做法。

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

于 2009-05-28T05:51:06.380 回答
0

我通常为我的每个 BLL 对象创建一个类范围的数据上下文。

我还创建了 2 个构造函数,1 个创建数据上下文,另一个接受数据上下文。第二个是我可以从其他 BLL 对象传递数据上下文。

这允许您对可能来自 2 个不同 BLL 对象的对象执行数据库操作,同时仍保持良好的关注点分离。您还需要将数据上下文公开为公共只读,以便可以传递它。

需要注意的是,不必明确处置 DataContext 对象,更多信息请参见此处。但基本上 DataContext 只会在 BLL 对象的生命周期内存在。如果您确实需要释放资源(即您已完成跟踪更改),您可以显式处理它。

例如

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();
    }
}
于 2009-05-28T05:46:32.880 回答