首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从实体框架中的实体获取DbContext

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

Stack Overflow用户
提问于 2014-08-10 23:20:32
回答 3查看 30.7K关注 0票数 32

我在业务层的某处,在Visual Studio的调试会话中,试图弄清楚为什么实体在试图持久存储更改时行为异常。

在调用堆栈中的这一点上,获得此实体所属的DbContext的引用将非常有帮助。

即查看该实体的状态是什么(未改变、修改等)。

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

代码语言:javascript
复制
var db_context = DbContextHelpers.GetDbContext(entity);

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

在调试期间,我可以在“即时”窗口中使用这些内容。

谁有什么建议?

Extra notes

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-28 04:32:18

对于EF6,我稍微修改了一下德克的回答:

代码语言:javascript
复制
    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(),并且它是可转换到您的主要实体类中的。

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

票数 18
EN

Stack Overflow用户

发布于 2014-08-11 01:21:00

代码语言:javascript
复制
public static DbContext GetDbContextFromEntity(object entity)
{
    var object_context = GetObjectContextFromEntity( entity );

    if ( object_context == null )
        return null;

    return new DbContext( object_context, dbContextOwnsObjectContext: false );
}

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;
}
票数 27
EN

Stack Overflow用户

发布于 2015-09-24 09:10:29

我找到another way去找ObjectContext了。我不知道这样会不会更好。

代码语言:javascript
复制
public static ObjectContext GetContext(this IEntityWithRelationships entity)
{
  if (entity == null)
    throw new ArgumentNullException("entity");

  var relationshipManager = entity.RelationshipManager;
  var relatedEnd = relationshipManager.GetAllRelatedEnds().FirstOrDefault();

  if (relatedEnd == null)
    throw new Exception("No relationships found");

  var query = relatedEnd.CreateSourceQuery() as ObjectQuery;
  if (query == null)
    throw new Exception("The Entity is Detached");

  return query.Context;
}

你可以像这样使用它:

代码语言:javascript
复制
MyContext context = myEntity.GetContext() as MyContext;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25230024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档