在LINQ to Entities中实例化一个上下文

20 浏览
0 Comments

在LINQ to Entities中实例化一个上下文

我看到程序员在创建实体上下文时有两种不同的方式。

第一种方式就像这样,在MSDN的代码示例中随处可见:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // 业务逻辑和其他操作
     }
}

第二种方式是将上下文创建为某个封装业务逻辑的类的私有属性。所以你会有类似这样的代码:

public class Education_LINQ {
        private TaxableEducationEntities context = new TaxableEducationEntities();
        public void DoSomething() {
            var result = from a in context.luAction
                         select a;
            // 业务逻辑和其他操作
        }
}

哪种方式更有效率?

假设你有两个方法,一个叫做DoSomething1(),另一个叫做DoSomething2(),这两个方法都使用using语句来打开上下文并进行操作。如果你依次调用这两个方法,是否会有多余的开销,因为实质上这两个方法都会创建上下文,然后在完成操作后进行清理?相对于只有一个在类对象实例化时创建的私有属性,然后在对象超出范围时进行清理?

0
0 Comments

文章标题:LINQ to Entities中上下文实例化的原因和解决方法

在LINQ to Entities中,实例化一个上下文(ObjectContext)每次都涉及到一些开销。这个开销主要包括将元数据从全局缓存复制到与特定ObjectContext相关联的元数据。虽然这个开销相对较小,所以通常不值得担心,特别是考虑到使用模式本身所具有的额外安全性。

选择哪种选项取决于以下因素:

1. 封装类的生命周期有多长?如果生命周期很长,ObjectContext可能会积累大量的实体,从而导致随着时间的推移变慢。因此,每次使用一个新的ObjectContext可能是个好主意。

2. 封装类的方法是否同步调用?ObjectContext类本身不是线程安全的,所以如果使用第二种模式,如果期望多个线程调用它,则需要确保封装类/仓储是线程安全的。

3. 这些方法是否本质上是不相关的?如果是的话,如果它们之间共享一个上下文,可能会出现意外的副作用。

如果方法是无状态的,即执行后立即忘记,那么为每个方法创建一个新的上下文可能是个好主意。然而,如果你有一个相对短暂的有状态表单或其他东西,那么共享一个上下文可能是个更好的选择。

关于在哪些情况下应该返回IQueryable而不是IEnumerable,以及在服务层之外的层次应该返回IQueryable的上下文,作者没有明确给出意见。

在LINQ to Entities中,实例化一个上下文(ObjectContext)每次都会有一些开销,但这个开销相对较小。选择是根据封装类的生命周期、方法的同步调用以及方法之间是否相关来确定的。一般来说,如果方法是无状态的,可以为每个方法创建一个新的上下文;如果有状态,则共享一个上下文可能更好。至于返回IQueryable还是IEnumerable,作者未给出明确建议。

参考链接:

- [a more complete answer](https://learn.microsoft.com/en-us/archive/blogs/alexj/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext)

- [blog post](http://blogs.msdn.com/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext.aspx)

- [managing entityconnection lifetime](http://stackoverflow.com/questions/2575485)

0
0 Comments

问题的出现原因:

在LINQ to Entities中实例化一个上下文的时候,使用不同的方法会导致不同的结果。在给定的代码示例中,使用了ObjectContext来实例化上下文,并将其包装在using语句中。这种方法可以确保在使用完上下文后进行正确的清理和释放资源。然而,在某些情况下,可能会选择将上下文作为类的私有属性,而不使用using语句来手动处理资源的释放。这可能会导致上下文没有被正确清理,从而引发一些问题。

解决方法:

为了确保在LINQ to Entities中实例化上下文时能够正确处理资源的释放,可以采取以下措施:

1. 使用using语句:将实例化上下文的代码包装在using语句中,以确保在使用完上下文后能够正确地进行清理和释放资源。

2. 手动处理资源的释放:如果选择将上下文作为类的私有属性,而不使用using语句来处理资源的释放,则需要在适当的时候手动调用上下文的Dispose方法,以确保资源能够被正确地释放。

3. 根据实际情况选择:根据具体的模型/领域的复杂性,可以根据需要选择是否需要将上下文传递给其他方法或类。在大多数情况下,使用using语句可以满足需求,但在某些特殊情况下,可能需要将上下文作为参数传递给其他方法或类,以便在整个过程中重用上下文。

在LINQ to Entities中实例化上下文时,需要根据实际情况选择适当的方法来处理资源的释放。使用using语句可以确保在使用完上下文后进行正确的清理和释放资源,而手动处理资源的释放则需要在适当的时候调用上下文的Dispose方法。根据具体的需求,可以选择是否将上下文传递给其他方法或类,以便在整个过程中重用上下文。

0