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

本文关键字:实体 DbContext 获取 框架 | 更新日期: 2023-09-27 18:17:32

我在Visual Studio的一个调试会话中深入业务层的某个地方,试图找出为什么一个实体在试图坚持更改时行为奇怪。

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

。查看该实体的状态(未更改,修改等)。

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

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

我可以在调试期间在即时窗口中使用这些东西。

谁有什么建议?

<

额外笔记/strong>

实体必须意识到DbContext某处,因为它正在使用它延迟加载导航属性?

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

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;
}

对于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(),它可以被浇注到你的主实体类。

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

我找到了另一种获取ObjectContext的方法。但我不知道这是否更好。

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;
}

你可以这样使用:

MyContext context = myEntity.GetContext() as MyContext;