【问题标题】:Do I need to dispose of a DbContext if it was created from an ObjectContext?如果 DbContext 是从 ObjectContext 创建的,我是否需要处理它?
【发布时间】:2015-07-21 02:43:03
【问题描述】:

我做了一些扩展方法来计算相关记录,我不想显式传递 DbContext,所以我获取 ObjectContext 并从中创建一个 DbContext。

当原来的 DbContext 被释放时,新的 DbContext 会被释放吗?

var original = new CustomDbContext("connectionString")
var entity = original.Table.First()

// in the extension method
var objectContext = entity.GetObjectContext()
var newDbContext = new CustomDbContext(objectContext, false)
// dispose of newDbContext??

// original caller
original.Dispose()

【问题讨论】:

  • 进行了一些测试,从 ObjectContext 创建的 DbContext 在您处理原始连接后无法使用。 (“ObjectContext 实例已被释放,不能再用于需要连接的操作。”)

标签: c# entity-framework


【解决方案1】:

经过更多的研究、测试和检查 DbContext 的源代码后,我得出了不需要的结论。 DbContext 只需要处理内部上下文,它是传递的 ObjectContext 的包装器。

如果您处置拥有 ObjectContext 的 DbContext,那么新的 DbContext 将基本上被处置。

【讨论】:

    【解决方案2】:

    从对象上下文构造一个新的 DbContext。将 dbContextOwnsObjectContext 设置为“true”时,ObjectContext 会在 DbContext 被释放时被释放,否则调用者必须释放连接。

    通过将其设置为 false,新的 DbContext 将不会被释放

    编辑

    这会将 objectContext 与 dbContexts 分开

            var objectContext = new ObjectContext("connectionString");
            var newDbContext1 = new CustomDbContext(objectContext, false);
            var newDbContext2 = new CustomDbContext(objectContext, false);
    
            newDbContext1.Dispose();
            newDbContext2.Dispose();
            objectContext.Dispose();
    

    【讨论】:

    • 嗯,很有趣,因为将其设置为 false 导致它没有被处置(如你所说)但无法使用(例外是 ObjectContext 被处置)。你会建议将其设置为 true 吗?
    • 将其设置为 true,处理新上下文将处理旧上下文。猜猜将它设置为 false 最适合我的用例,我不需要处理新的 dbcontext。
    • OIC...您是否从单个 ObjectContext 创建多个 DBContext,该 ObjectContext 是从初始化 DBContext 创建创建的?您需要创建一个“根”类型 ObjectContext,然后从该单个对象上下文中提取 DBContext ...
    • 是的,除了其中一个 DbContext 实际上是所有者。处置所有者将处置二手对象上使用的连接。这就是我希望发生的事情。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多