我在业务层的某处,在Visual Studio的调试会话中,试图弄清楚为什么实体在试图持久存储更改时行为异常。
在调用堆栈中的这一点上,获得此实体所属的DbContext的引用将非常有帮助。
即查看该实体的状态是什么(未改变、修改等)。
所以我正在寻找一个像这样的辅助方法:
var db_context = DbContextHelpers.GetDbContext(entity);
// after that I could do something like this
var state = db_context.Entry(entity);
在调试期间,我可以在“即时”窗口中使用这些内容。
谁有什么建议?
Extra notes
实体一定知道某个地方的DbContext
,因为它正在使用它来延迟加载导航属性?
发布于 2017-04-28 04:32:18
对于EF6,我稍微修改了一下德克的回答:
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“字段。
发布于 2014-08-11 01:21:00
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;
}
发布于 2015-09-24 09:10:29
我找到another way去找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;
https://stackoverflow.com/questions/25230024
复制相似问题