如何禁用实体框架4.3代码第一次使用__MigrationHistory表?(How can I d

2019-06-25 22:03发布

我使用实体框架4.3的代码先用这样的自定义数据库初始化:

public class MyContext : DbContext
{
    public MyContext()
    {
        Database.SetInitializer(new MyContextInitializer());
    }
}

public class MyContextInitializer : CreateDatabaseIfNotExists<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Add defaults to certain tables in the database

        base.Seed(context);
    }
}

每当我的模型变化,修改我的POCO的手动映射和我手动更新我的数据库。

当我再次运行我的申请,我得到这个错误:

在“/”应用程序的服务器错误。

该模型支持的“MyContext”语境已经改变,因为该数据库已创建。 考虑使用代码首先迁移到更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

说明:在当前Web请求的执行过程中发生未处理的异常。 请检查堆栈跟踪有关该错误它起源于代码的详细信息和。

异常详细信息:System.InvalidOperationException:该模型支持的“MyContext”语境已经改变,因为该数据库已创建。 考虑使用代码首先迁移到更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

使用EFProfiler,我也注意到正在执行这些查询:

-- statement #1
SELECT [GroupBy1].[A1] AS [C1]
FROM   (SELECT COUNT(1) AS [A1]
        FROM   [dbo].[__MigrationHistory] AS [Extent1]) AS [GroupBy1]

-- statement #2
SELECT TOP (1) [Project1].[C1]          AS [C1],
               [Project1].[MigrationId] AS [MigrationId],
               [Project1].[Model]       AS [Model]
FROM   (SELECT [Extent1].[MigrationId] AS [MigrationId],
               [Extent1].[CreatedOn]   AS [CreatedOn],
               [Extent1].[Model]       AS [Model],
               1                       AS [C1]
        FROM   [dbo].[__MigrationHistory] AS [Extent1]) AS [Project1]
ORDER  BY [Project1].[CreatedOn] DESC

我怎样才能避免这种情况?

Answer 1:

起初,我确信那是因为你设置的构造函数的默认初始值,但调查了一下,我发现在创建上下文时的初始化中运行,而是当你查询/首次添加的东西。

所提供的初始化所有检查模式保持兼容,所以你的运气与他们的。 您可以轻松地制作自己的初始化这样虽然不是:

 public class Initializer : IDatabaseInitializer<Context>
    {

        public void InitializeDatabase(Context context)
        {
            if (!context.Database.Exists())
            {
                context.Database.Create();
                Seed(context);
                context.SaveChanges();
            }
        }

        private void Seed(Context context)
        {
            throw new NotImplementedException();
        }
    }

这不应该检查保持兼容,如果数据库丢失,将创建它。

更新:“上下文”应该是你实现的DbContext的类型



Answer 2:

传递null System.Data.Entity.Database

public static void SetInitializer<TContext>(
    IDatabaseInitializer<TContext> strategy
)
where TContext : DbContext

为您的上下文禁用初始化。 不实施IDatabaseInitializer禁用它。

https://msdn.microsoft.com/en-us/library/system.data.entity.database.setinitializer(v=vs.113).aspx



文章来源: How can I disable the use of the __MigrationHistory table in Entity Framework 4.3 Code First?