在LINQ-SQL中,包装DataContext是一个using语句 - pros cons

hIp*_*pPy 22 linq datacontext using linq-to-sql

有人可以根据性能,内存使用,编码的简易性,正确的事情等因素,在使用语句中包含DataContext或在LINQ-SQL中包含Data/Text之间的优缺点.

更新:在一个特定的应用程序中,我经历过,没有将DataContext包装在使用块中,随着活动对象未针对GC发布,内存使用量不断增加.在下面的示例中,如果我持有对q的列表和q的访问实体的引用,我创建了一个未针对GC发布的对象图.

使用DataContext

    using (DBDataContext db = new DBDataContext())
    {
        var q = 
            from x in db.Tables
            where x.Id == someId
            select x;

        return q.toList();
    }
Run Code Online (Sandbox Code Playgroud)

DataContext没有使用和保持活着

  DBDataContext db = new DBDataContext()
  var q = 
        from x in db.Tables
        where x.Id == someId
        select x;

    return q.toList(); 
Run Code Online (Sandbox Code Playgroud)

谢谢.

Nic*_*ver 11

相对于其他事物,DataContext创建起来可能很昂贵.但是,如果你已经完成它并希望尽快关闭连接,这将做到这一点,也从上下文中释放任何缓存的结果.记住你无论如何都在创造它,在这种情况下,你只是让垃圾收集器知道有更多免费的东西要摆脱.

DataContext是一个简短的使用对象,使用它,完成工作单元,离开......这正是你正在使用的东西.

所以优点:

  • 更快的封闭连接
  • 来自dispose的可用内存(内容中的缓存对象)

缺点 - 更多代码?但这不应该是一种威慑,你在using这里正确使用.

请看Microsoft解答:http: //social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/2625b105-2cff-45ad-ba29-abdd763f74fe

短版本如果你需要使用using/ .Dispose():

答案简短; 不,你不必,但你应该 ......

  • 显然,我们已经听说过创建DataContext的复杂性. (2认同)

Jam*_*ran 5

嗯,这是一个IDisposable,所以我想这不是一个坏主意.MSFT的人们说他们让DataContexts尽可能轻量级,这样你就可以不顾一切地放弃它们,所以你可能不会获得太多......

  • @ mark123:只有一个例外,你在一个单独的方法中创建,使用和完成的所有IDisposable都应该在`using'块中使用.否则,作者就不会选择实现`IDisposable`. (3认同)

Vla*_*jic 5

  1. 第一次DataContext将从DB获取对象.
  2. 下次触发查询以获取相同的对象(相同的参数):您将在分析器中看到查询,但DataContext中的对象将不会被DB中的新对象替换!

更不用说每个DataContext后面都是您从DB请求的所有对象的身份映射(您不想保留它).

DataContext的整个想法是具有乐观并发的工作单元.用于短期交易(仅提交一次)并处置.

不要忘记处理的最好方法是使用().