11

我正在使用带有自定义数据库初始化程序的 Entity Framework 4.3 Code First,如下所示:

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”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息: System.InvalidOperationException:支持“MyContext”上下文的模型自创建数据库以来已更改。考虑使用 Code First 迁移来更新数据库 (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

我怎样才能防止这种情况?

4

2 回答 2

10

起初我确定这是因为您在 ctor 中设置了默认初始化程序,但经过一番调查,我发现初始化程序不是在创建上下文时运行,而是在您第一次查询/添加某些内容时运行。

提供的初始化程序都检查模型兼容性,所以你对它们不走运。不过,您可以轻松地制作自己的初始化程序:

 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 实现的类型

于 2012-06-29T09:53:46.507 回答
0

将 null 传递给System.Data.Entity.Database's

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

于 2017-01-30T18:08:44.900 回答