asp.net-mvc-3 - 升级到EF 4.1后,出现System.NullReferenceException

标签 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.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获得了EF 4.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();
        }
    }

PopulateDatabase()方法引发异常。

有任何想法吗?

更新:

看来问题出在第二个DatabaseContext实例化以手动重新创建数据库。它必须以某种方式干扰原始上下文。

最佳答案

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

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);
    }
}

关于asp.net-mvc-3 - 升级到EF 4.1后,出现System.NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365376/

相关文章:

c# - Entity Framework : Model Contain A list(navigational properties) of three items of type= itself , 给出错误。 (可能是外键映射错误)

c# - SQL 到 LINQ 转换器

asp.net-mvc-3 - 为什么 Html.LabelFor 在局部 View 中不起作用?

asp.net-mvc-3 - 服务器端命令行

c# - NullReferenceException ASP.NET MVC 5

unity-game-engine - Unity3D : NullReferenceException: Object reference not set to an instance of an object

entity-framework - EF代码优先的自定义初始化策略,该策略不会删除表以添加列

asp.net-mvc - MVC项目PartialViewResult、ActionResult、ViewResult类之间有什么区别?

c# - 在 Rotativa 生成的 PDF 中显示页眉和页脚

c# - F# 与 C# 类互操作,该类具有一个可选的可空参数设置为除 null 之外的任何值会导致 NullReferenceException/AccessViolationException