C# 何时可以处置我的DataContext?
以以下为例:C# 何时可以处置我的DataContext?,c#,linq-to-sql,datacontext,C#,Linq To Sql,Datacontext,以以下为例: MyDataContext context = new MyDataContext(); // DB connection established. MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 假设我的实体与我将通过访问的其他表有关系 foreach(MyEntity.RelatedTable中的var记录) 为了访问实体的属性,我是否需要在第二行之后保持Da
MyDataContext context = new MyDataContext(); // DB connection established.
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity
假设我的实体与我将通过访问的其他表有关系
foreach(MyEntity.RelatedTable中的var记录)
为了访问实体的属性,我是否需要在第二行之后保持DataContext的活动状态,或者它是否足够安全,可以进行处置
我知道LINQtoSQL使用延迟执行,因此我想知道它是否仅在最初检索实体时使用延迟执行,或者在访问相关表记录时是否也使用延迟执行
范例
我的repo中的insert方法调用SubmitChanges
。那么上述情况是否可以接受,或者这是对连接的浪费。我是否应该切实做到:
var userRepo = new UserRepository();
var activeUsers = userRepo.FindActiveUsers();
foreach (var user in activeUsers)
{
// do something with user
var audit = new Audit();
audit.Date = DateTime.Now;
audit.UserID = user.ID;
user.Audits.Add(audit);
userRepo.Save();
}
要重新使用已打开的DataContext?如果打开一个高级datacontext,然后必须进行一些低级处理,我应该向下传递userRepo还是创建一个单独的存储库,您会怎么做?您不需要处理datacontext,因为它是一个轻量级对象,所有内部db连接都被缓存。如果您处置了它,您将无法访问相关实体。您不需要处置DataContext,因为它是一个轻量级对象,所有内部db连接都被缓存。如果您处理了它,您将无法访问相关实体。要访问其他表中的字段,您需要保持DataContext处于活动状态。另外,不要直接调用dispose,请使用using关键字
using (MyDataContext context = new MyDataContext()) // DB connection established.
{
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity
foreach (var record in MyEntity.RelatedTable)
{
...
}
}
要访问其他表中的字段,需要保持DataContext处于活动状态。另外,不要直接调用dispose,请使用using关键字
using (MyDataContext context = new MyDataContext()) // DB connection established.
{
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity
foreach (var record in MyEntity.RelatedTable)
{
...
}
}
所以L2S在访问相关实体时也使用延迟执行?是的,除非您使用DataContext.LoadWith方法,否则它使用延迟执行谢谢提示!从未意识到此选项可用无需担心!在大多数情况下,使用LoadWith选项将提高性能,因为sql查询一次加载它所需的所有数据,而不是在访问每个相关实体时为其运行另一个查询(N+1问题)。假设您有一个需要同时打开2个DataContext的场景?这通常是一个好主意还是有更好的方法?因此L2S在访问相关实体时也使用延迟执行?是的,除非您使用DataContext.LoadWith方法,否则它使用延迟执行谢谢提示!从未意识到此选项可用无需担心!在大多数情况下,使用LoadWith选项将提高性能,因为sql查询一次加载它所需的所有数据,而不是在访问每个相关实体时为其运行另一个查询(N+1问题)。假设您有一个需要同时打开2个DataContext的场景?这通常是一个好主意还是有更好的方法?在处理回购协议时,是否总是建议使用using语句?我已经创建了我正在使用的自定义存储库,有时将我所有的代码封装在using语句中似乎不是一个好主意。您的意思是,您有一些自定义编写的代码,只有您自己处理,并且您可以保证,如果您省略Dispose调用,它不会占用任何资源超过必要的时间,将来也不会这样做?那么在你的情况下,我想不用打电话也没关系。但一般来说,在实现IDisposable的任何对象上调用using是一种很好的做法。如果不这样做,您将不会泄漏任何内容:垃圾收集器将清理超出范围的未经处理的对象。但是你不知道垃圾收集器什么时候运行,如果有的话。在处理回购协议时,是否总是建议使用using语句?我已经创建了我正在使用的自定义存储库,有时将我所有的代码封装在using语句中似乎不是一个好主意。您的意思是,您有一些自定义编写的代码,只有您自己处理,并且您可以保证,如果您省略Dispose调用,它不会占用任何资源超过必要的时间,将来也不会这样做?那么在你的情况下,我想不用打电话也没关系。但一般来说,在实现IDisposable的任何对象上调用using是一种很好的做法。如果不这样做,您将不会泄漏任何内容:垃圾收集器将清理超出范围的未经处理的对象。但是你不知道垃圾收集器什么时候运行,如果有的话。