Entity framework 从代理对象检索实体框架DbContext

Entity framework 从代理对象检索实体框架DbContext,entity-framework,Entity Framework,我首先使用实体框架6,DBcontext数据库。 我有一些情况,当我有一个代理对象,我想得到DBContext。 我正在使用以下代码: using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Objects; namespace Sample { public class MyDbContext : DbContext { private static readon

我首先使用实体框架6,DBcontext数据库。 我有一些情况,当我有一个代理对象,我想得到DBContext。 我正在使用以下代码:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;

namespace Sample
{
    public class MyDbContext : DbContext
{
    private static readonly Dictionary<ObjectContext, MyDbContext> contexts = 
        new Dictionary<ObjectContext, MyDbContext>();

    public static MyDbContext FromObjectContext(ObjectContext context)
    {
        lock (contexts)
        {
            if (contexts.ContainsKey(context))
                return contexts[context];
            return null; 
        }
    }

    public static MyDbContext FromObject(object obj)
    {
        var field = obj.GetType().GetField("_entityWrapper");
        var wrapper = field.GetValue(obj);
        var property = wrapper.GetType().GetProperty("Context");
        var context = (ObjectContext)property.GetValue(wrapper, null);
        return FromObjectContext(context);
    }

    public MyDbContext()
    {
        lock (contexts)
            contexts[((IObjectContextAdapter)this).ObjectContext] = this; 
    }

    protected override void Dispose(bool disposing)
    {
        lock (contexts)
            contexts.Remove(((IObjectContextAdapter)this).ObjectContext);
        base.Dispose(disposing);
    }

}
除一种情况外,此代码正常工作:

如果我添加了一个新对象并调用SaveChanges,然后尝试获取DbContext,我会得到一个错误。在线:

Dim wrapper = field.GetValue(obj)
错误:

An unhandled exception of type 'System.NullReferenceException' occurred in myprog.exe

Additional information: Object reference not set to an instance of an object.
我还发现,在这种情况下,此行不返回任何内容:

var field = obj.GetType().GetField("_entityWrapper");
我能做什么?
谢谢大家!

添加新对象时,新对象仍然是原始对象(不是带有代理的对象)。您可以使用DbSet.Create而不是new,这样您就已经有了一个代理实体

var field = obj.GetType().GetField("_entityWrapper");