Asp.net mvc 3 升级到EF 4.1后出现System.NullReferenceException异常

Asp.net mvc 3 升级到EF 4.1后出现System.NullReferenceException异常,asp.net-mvc-3,nullreferenceexception,entity-framework-4.1,Asp.net Mvc 3,Nullreferenceexception,Entity Framework 4.1,我有一个使用EF CTP5的MVC3应用程序。升级到EF 4.1后,我从这里抛出NullReferenceException: at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) at System.D

我有一个使用EF CTP5的MVC3应用程序。升级到EF 4.1后,我从这里抛出
NullReferenceException

   at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
我从NuGet得到了EF4.1比特

使用自定义初始值设定项初始化数据库

    public class RecreateDatabaseInitializer : IDatabaseInitializer<DatabaseContext>
    {
        public void InitializeDatabase(DatabaseContext context)
        {
            if (ConfigurationManager.ConnectionStrings["DatabaseContextSA"] == null)
            {
                EventLog.WriteEntry("RecreateDatabaseInitializer", "Connection string 'DatabaseContextSA' doesn't exist in config file.", EventLogEntryType.Warning);
                return;
            }

            using (var ctx = new DatabaseContext("DatabaseContextSA"))
            {
                if (ctx.Database.Exists())
                    DropDatabase(ctx);

                CreateDatabase(ctx);
                InitializeDatabaseObjects(ctx);
                ctx.SaveChanges();
            }

            PopulateDatabase(context);
            context.SaveChanges();
        }
    }
公共类重新创建DatabaseInitializer:IDatabaseInitializer
{
public void InitializeDatabase(数据库上下文)
{
if(ConfigurationManager.ConnectionString[“DatabaseContextSA”]==null)
{
WriteEntry(“RecreateDatabaseInitializer”,“配置文件中不存在连接字符串'DatabaseContextSA'”,EventLogEntryType.Warning);
返回;
}
使用(var ctx=newdatabasecontext(“DatabaseContextSA”))
{
if(ctx.Database.Exists())
DropDatabase(ctx);
创建数据库(ctx);
初始化TabaseObjects(ctx);
ctx.SaveChanges();
}
填充数据库(上下文);
SaveChanges();
}
}
异常是从
PopulateDatabase()
方法引发的

有什么想法吗

更新:

问题似乎源于实例化第二个DatabaseContext以手动重新创建数据库。它一定会以某种方式干扰原始上下文。

我曾经使用过,但不得不对其进行一些修改。这是必需的(我相信),因为我使用sql身份验证,并且有两个连接字符串(一个具有提升的权限,另一个仅具有读/写权限)

公共类ForceDeleteInitializer:IDatabaseInitializer
{
私有只读IDatabaseInitializer InnerInitializer;
public ForceDeleteInitializer(IDatabaseInitializer innerInitializer)
{
this.InnerInitializer=InnerInitializer;
}
public void InitializeDatabase(数据库上下文)
{
使用(var ctx=newdatabasecontext(“DatabaseContextSA”))
{
Database.SetInitializer(null);
ctx.Database.ExecuteSqlCommand(“ALTER Database”+ctx.Database.Connection.Database+“将单个用户设置为立即回滚”);
}
this.InnerInitializer.InitializeDatabase(上下文);
SetInitializer(这个);
}
}

如何初始化数据库?@Jakub,我在异常的堆栈跟踪中没有看到
NullReferenceException
。。。此外,你能用一个兼容的例子来复制错误吗?@Ladislav-谢谢,我会尝试更改初始值设定项,看看会发生什么。顺便说一句。为什么要使用第二个上下文?我认为您已经找到了自己的解决方案。移动它来回答并接受它。如果我的装饰师帮你把我的链接答案投上去。我通常不喜欢在没有任何附加信息作为答案的情况下,重新发布指向其他问题的简单链接。
public class ForceDeleteInitializer : IDatabaseInitializer<DatabaseContext>
{
    private readonly IDatabaseInitializer<DatabaseContext> InnerInitializer;

    public ForceDeleteInitializer(IDatabaseInitializer<DatabaseContext> innerInitializer)
    {
        this.InnerInitializer = innerInitializer;
    }

    public void InitializeDatabase(DatabaseContext context)
    {
        using (var ctx = new DatabaseContext("DatabaseContextSA"))
        {
            Database.SetInitializer<DatabaseContext>(null);
            ctx.Database.ExecuteSqlCommand("ALTER DATABASE " + ctx.Database.Connection.Database + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
        }

        this.InnerInitializer.InitializeDatabase(context);

        Database.SetInitializer<DatabaseContext>(this);
    }
}