我在当前的 Web 项目中大量使用 L2S,我相信您会发现最大的问题是有关进行 n 层数据库开发的最佳方法的文档相互矛盾。
首先,您需要预先意识到的是,DataContext 对象的持续时间仅与工作单元、周期一样长。此外,DataContext 是无状态的。一旦你掌握了这两个原则,在 n 层环境中使用 LINQ 就可以很好地工作了。
另一方面,你会看到很多人推荐一些非常非常非常糟糕的方式来使用 Linq。永远不要让你的 DataContext 静态,这是我早期犯的一个错误,它创造了奇迹,直到它不起作用,然后在不同的会话中交叉错误的数据等,这绝对是可怕的。简单地说,这可能是最大的使用 Linq 的最大禁忌,应该在每个文档中用粗体大写字母书写。此外,在 Session 变量中持久保存 DataContext 也是一个坏主意。
我在使用 LINQ 时遇到的唯一另一个主要问题是在进行断开连接的更新时,您需要在整个调用中使用相同的 DataContext。例如:
public static void UpdateUser(UserLibrary.User user) {
using (UserLibraryDataContext dc = new UserLibraryDataContext(_conStr))
{
UserLibrary.User newUser = (from user2 in dc.Users where user2.UserID == user.UserID select user2).FirstOrDefault();
newUser.Email = user.Email;
newUser.FirstName = user.FirstName;
newUser.LastName = user.LastName;
dc.SubmitChanges();
}
您不能简单地传入在不同数据上下文中创建的用户并期望更新工作,除非您设置 DataContext.ObjectTrackingEnabled = false,我不建议这样做。相反,在同一个 DataContext 中,您应该检索现有对象,更新其值,然后提交更改。将所有类似的任务保存在同一个 DataContext 中。
不过我会推荐 L2S,一旦你解决了一些琐碎的问题(比如上面的问题),它就是一项很棒的技术,而且绝对可以节省时间。但是,我建议在您的 DAL 周围做一个薄包装,这样您就可以轻松更改。我正在考虑(出于经济原因)将我的部分代码移植到使用 OpenAccess ORM -> MySql 进行部分数据访问,并且使用正确定义的层,这项任务应该只需要我几个小时。