Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时可以处置我的DataContext?_C#_Linq To Sql_Datacontext - Fatal编程技术网

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是一种很好的做法。如果不这样做,您将不会泄漏任何内容:垃圾收集器将清理超出范围的未经处理的对象。但是你不知道垃圾收集器什么时候运行,如果有的话。