我使用代码优先数据库启动了我的项目,但现在已切换到生产数据库的副本,并且旨在让测试环境看起来更像生产环境。因此,我不希望EF创建任何表格(他们已经存在),我确定不希望它放弃任何表格。
所以,我在Global.asax.cs Application_Start()的顶部添加了这个:
Database.SetInitializer<ProjectContext>(null);
但我仍然收到一条错误消息:
&#34;无法删除数据库&#39; master&#39;因为它是一个系统数据库。&#34;
我认为在用null初始化之后我不应该尝试做下降吗?
在我的控制器中,我执行以下操作:
var userclientobjectvalues = context.UserClientObjectValues;
var projects = context.Projects;
var users = context.Users;
var objectvalues = context.ObjectValues;
var userProjects = userclientobjectvalues.Where(v => v.user_id == user);
前四行只是为了确保我正确地收集数据。在调试模式下,结果视图扩展恰到好处,包含所有数据。
上述崩溃发生在上面代码块的最后一行。
来自Global.asax.cs:
protected void Application_Start()
{
Database.SetInitializer(new NullDatabaseInitializer<ProjectContext>());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
答案 0 :(得分:1)
在评论中一些来回摆弄后,似乎上下文是在web.config
中定义的(而不是在代码上),所以初始化程序也必须在那里设置。
所以在上下文行设置disableDatabaseInitialization="true"
:
<context type="MyProject.MyContext, MyAssembly" disableDatabaseInitialization="true" />
或者如果你想要一个不同的初始化器,你可以这样做:
<context type="MyProject.MyContext, MyAssembly">
<databaseInitializer type="MyProject.MyDbInitializer, MyAssembly">
<parameters>
<parameter value="MyConstructorParameters" />
</parameters>
</databaseInitializer>
</context>
由于错误是它无法删除master
,我还要重新检查连接字符串并确保它们具有Initial Catalog
属性:代码优先的上下文不应该与master
数据库(至少对于SQL Server)。