我正在使用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和映射,并手动更新数据库。
当我再次运行我的应用程序时,我收到此错误:
2>'/'应用程序中的服务器错误。自创建数据库以来,支持“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
我该如何防止这种情况?
答案 0 :(得分: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
的实现类型答案 1 :(得分:0)
将null传递给System.Data.Entity.Database
&#39>
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