Entity framework 4 频繁实例化和处置模型时的实体框架性能问题

Entity framework 4 频繁实例化和处置模型时的实体框架性能问题,entity-framework-4,model,dispose,Entity Framework 4,Model,Dispose,每次调用DAL方法时,我都会创建一个新的System.Data.Objects.ObjectContext(我的EF模型): Public void DoSomeDataManipulation() { using (MyModel myModel = new MyModel(connectionString)) myModel.AddRecord(someParametersHere); } DoSomeDataManipulation()经常被调用(还有许多其他方法

每次调用
DAL
方法时,我都会创建一个新的
System.Data.Objects.ObjectContext
(我的
EF
模型):

Public void DoSomeDataManipulation()
{
    using (MyModel myModel = new MyModel(connectionString))
        myModel.AddRecord(someParametersHere);
}
DoSomeDataManipulation()
经常被调用(还有许多其他方法)。我尝试了
myModel
static
版本,但是
EF
在高负载下会产生许多并发错误


目前,我很好奇这种方法是否会导致
大型对象堆
,以及它是否是调用映射的
EF
方法的最佳实践。

使用静态上下文是一种糟糕的实践-您已经发现它在并发场景中不起作用(因为上下文不是线程安全的),但它也有

您应该为每个工作单元使用上下文的新实例。是否添加单个记录工作单元(业务操作/事务)?在这种情况下,您使用它是正确的。如果您的工作单元正在添加多个记录或任何其他更复杂的场景,其中您插入/更新/删除了多个实体,那么您应该在整个操作中使用一个上下文实例

为操作使用新上下文不应导致性能问题。上下文在内部使用一些映射描述,这些描述无论如何都是共享的。大堆可能会出现问题,但在使用静态上下文时,这不会有任何区别


由于POCO代理(跟踪或延迟加载)经常导致内存泄漏,因此可能会发生大堆。如果从上下文加载实体,然后在不分离实体的情况下处理上下文,则该实体仍将保留对上下文的引用,而上下文将保留对所有附加实体的引用=如果主实体仍被引用,则对象上下文或其引用的任何内容都不能被垃圾收集。同时,分离实体将破坏所有关系,因为没有“DetachGraph”。可以逐个拆离实体,EF将中断导航属性。我认为这是实体框架和动态代理中的一个缺陷。

我用
ANTS内存分析器
RedGate
跟踪
LOH
。它说有一些根对象(比如静态对象)。我不确定
LOH
是否是由
EF
或我的项目的其他部分引起的。不幸的是,被跟踪的对象是
System.object
类型,这是一种非常通用且难以猜测的类型(它有一些属性,我正试图找到该对象的来源)。