【问题标题】:When can I dispose of my DataContext?我什么时候可以处理我的 DataContext?
【发布时间】:2010-12-27 10:10:27
【问题描述】:

举个例子:

MyDataContext context = new MyDataContext(); // DB connection established.
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity

假设我的实体与我将通过

访问的其他表有关系

foreach (var record in MyEntity.RelatedTable)

我是否需要在第二行之后保持我的 DataContext 处于活动状态才能访问实体的属性,或者它是否足够安全以进行处置?

我了解 Linq to SQL 使用延迟执行,因此我想知道它是否仅在您最初检索实体时使用延迟执行,或者它是否在访问相关表记录时也使用延迟执行。

示例

var userRepo = new UserRepository(); // creates new DataContext
var auditRepo = new AuditRepository(); // creates new DataContext
var activeUsers = userRepo.FindActiveUsers();
foreach (var user in activeUsers)
{
    // do something with the  user
    var audit = new Audit();
    audit.Date = DateTime.Now;
    audit.UserID = user.ID;
    auditRepo.Insert(audit);
}

我的 repo 中的插入方法调用 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?如果您打开一个高级数据上下文,然后必须进行一些低级处理,您会怎么做,我应该向下传递 userRepo 还是应该创建一个单独的存储库?

【问题讨论】:

    标签: c# linq-to-sql datacontext


    【解决方案1】:

    要访问其他表中的字段,您需要保持 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)
        {
            ...
        }
    }
    

    【讨论】:

    • 在处理 repos 时是否总是建议使用 using 语句?我已经创建了我正在使用的自定义存储库,有时将我的所有代码包装在 using 语句中似乎不是一个好主意
    • 您的意思是您有一些自定义编写的代码,只有您自己处理,如果您省略 Dispose 调用,您可以保证它不会占用任何资源超过必要的时间,并且将来永远不会这样做?那么在你的情况下,我想不调用 using 是可以的。但一般来说,在任何实现 IDisposable 的对象上调用 using 是一种很好的做法。如果您不这样做,您将不会泄漏任何东西:垃圾收集器将清理超出范围的未处理对象。但是你不知道垃圾收集器什么时候运行,如果有的话。
    【解决方案2】:

    您不需要处理 DataContext,因为它是一个轻量级对象,并且所有内部数据库连接都被缓存。如果您处置它,您将无法访问相关实体。

    【讨论】:

    • 所以 L2S 在访问相关实体时也使用延迟执行?
    • 是的,它使用延迟执行,除非您使用 DataContext.LoadWith 方法
    • 感谢您的提示!从来没有意识到这个选项是可用的
    • 别担心!在大多数情况下,使用 LoadWith 选项将提高性能,因为 sql 查询一次加载它需要的所有数据,而不是在访问每个相关实体时为每个相关实体运行另一个查询(N+1 问题)。
    • 假设您有一个场景需要同时打开 2 个数据上下文?这通常是个好主意还是有更好的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2010-09-19
    • 2011-09-02
    相关资源
    最近更新 更多