实体框架一直想丢弃我的数据库,为什么?

时间:2016-04-22 10:37:07

标签: c# entity-framework

我使用代码优先数据库启动了我的项目,但现在已切换到生产数据库的副本,并且旨在让测试环境看起来更像生产环境。因此,我不希望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);
        }

1 个答案:

答案 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)。