簡體   English   中英

從實體框架中的實體獲取DbContext

[英]Get DbContext from Entity in Entity Framework

在Visual Studio中的調試會話中,我深入到Business層中的某個位置,試圖找出實體在嘗試持久化更改時表現異常的原因。

在調用堆棧中此處獲取對此實體所屬的DbContext的引用確實很有幫助。

即,看看這個實體的狀態是什么(Unchanged,Modified等)。

所以我正在尋找這樣的輔助方法:

var db_context = DbContextHelpers.GetDbContext(entity);

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

我可以在調試期間在立即窗口中使用這些東西。

任何建議?

額外的筆記

實體必須知道某處的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(),它可以轉換為您的主要Entities類。

注意:對於上述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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM