如何从实体框架中的实体获取DbContext?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

在Visual Studio中的调试会话中,我深入到业务层的某个地方,试图弄清楚为什么实体在尝试保持更改时行为异常。

在调用堆栈中的这一点上获取对此实体所属的DbContext的引用真的很有帮助。

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

所以我正在寻找这样的帮手方法:

var db_context = DbContextHelpers.GetDbContext(entity);

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

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

有任何建议吗?

提问于
用户回答回答于
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;
}
用户回答回答于

我发现另一种方式获取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;

所属标签

可能回答问题的人

  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • Richel

    8 粉丝0 提问4 回答
  • 人生的旅途

    10 粉丝484 提问3 回答
  • 发条丶魔灵1

    6 粉丝525 提问3 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励