从实体框架中的实体获取DbContext

德克·波尔

我在Visual Studio中的调试会话中的业务层某个地方很深,试图弄清楚为什么在尝试保留更改时实体表现出奇怪的行为。

此时,在调用堆栈中获得对该实体所属的DbContext的引用确实很有帮助。

即查看该实体的状态是什么(未更改,已修改等)。

所以我正在寻找这样的辅助方法:

var db_context = DbContextHelpers.GetDbContext(entity);

// after that I could do something like this
var state = db_context.Entry(entity);

我可以在调试过程中在“即时”窗口中使用这些东西。

有任何建议吗?

额外注意事项

实体必须知道DbContext某个地方,因为它正在使用它来延迟加载导航属性?

内核

对于EF6,我稍微修改了Dirk的答案:

    public static DbContext GetDbContextFromEntity(object entity)
    {
        var object_context = GetObjectContextFromEntity(entity);

        if (object_context == null || object_context.TransactionHandler == null)
            return null;

        return  object_context.TransactionHandler.DbContext;
    }

    private static ObjectContext GetObjectContextFromEntity(object entity)
    {
        var field = entity.GetType().GetField("_entityWrapper");

        if (field == null)
            return null;

        var wrapper = field.GetValue(entity);
        var property = wrapper.GetType().GetProperty("Context");
        var context = (ObjectContext)property.GetValue(wrapper, null);

        return context;
    }

没有新的DbContext(),并且可以将其强制转换为您的主要Entities类。

注意:对于上述返回值为空的问题,如果尚未保存/提交实体,则会发生这种情况。只能在.Local中找到的新实体似乎没有“ _entityWrapper”字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章