如果在DbContext中更改model-class,我是否重建数据库?
我在带有DBContext的MVC中有我的应用程序,在我的SQL的本地主机中,我的数据库有数据。 然后我需要在一个表中添加一个新列,在我的模型类中添加我的新成员,然后在SQL中修改我的表,但是当我执行我的应用程序时:“..上下文已经改变…考虑使用代码首先迁移.. “。
看看这篇文章: https : //msdn.microsoft.com/en-us/data/jj591621.aspx
如果您按照所需步骤操作,则可以从“程序包管理器控制台”运行“更新数据库”。
例:
- 进行必要的代码更改
- 从程序包管理器控制台 :运行添加迁移 [迁移名称]
- 对生成的代码进行必要的更改。
- 从程序包管理器控制台 :运行Update-Database
@anAgent为您提供答案。 我想向您提供有关这里发生的事情的更多信息,以便您了解为什么这些步骤是必要的。
为了生成迁移,Entity Framework会创建一个_MigrationHistory
表来跟踪应用程序实体的状态。 每次运行迁移时,都会在此表中添加一个新行,并在此时使用模式的散列版本。 启动时,Entity Framework使用此存储状态与实体的当前状态进行比较,如果它们不匹配,则会收到该错误,告知您模型支持已更改。 这意味着,为了使您的应用程序代码能够使用底层数据库,需要进行架构修改或存在SQL错误。
您所做的是手动对数据库进行适当的更改,这足以使应用程序正常运行。 但是,由于此_MigrationHistory
表仍将旧状态作为最新状态,因此entity framework仍认为需要更新架构。 同样,它不是在查看数据库的当前状态; 它正在查看上次成功迁移后的数据库状态。
所有这一切归结为你必须:
-
遵循@ anAgent的建议并实际使用迁移进行更改,而不是手动更改模式。
-
删除
_MigrationHistory
表并继续手动更新架构。 如果此表不存在,Entity Framework会有效地将数据库视为现有数据库,并且不会对其进行迁移,甚至不会提示您。 但是,这会将球完全放在球场上。 您将100%负责管理架构,如果您对应用程序进行了更改而忽略了也适当地更新了数据库架构,则应用程序将引发SQL错误exception。
我想你的应用程序中仍然有以下声明:
Database.SetInitializer(new CreateDatabaseIfNotExists());
在这种情况下,如果不存在,它将重新创建数据库。 还有一个这样的:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
第二个将validation您的数据库已更改。 这就是你似乎正在发生的事情。 如果禁用此function,则不会进行validation。 您更改了数据库,并且更改了代码,因此如果我理解正确,则不需要迁移。但必须注释掉上述语句或任何setinitialiser。
如果您的模型在某些时候发生了变化,您还需要更改数据库模式。 如exception所示,是时候开始使用Code First Migrations 。您需要使用新的db初始化策略MigrateDatabaseToLatestVersion
在上下文类中设置数据库初始化MigrateDatabaseToLatestVersion
,如下所示:
public class YourContext: DbContext { public YourContext(): base("DefaultConnectionString") { Database.SetInitializer(new MigrateDatabaseToLatestVersion("DefaultConnectionString")); } }
现在,您有两种选择:
-
自动迁移
您运行应用程序并始终使用最新版本获取数据库,因为EF将在每次需要时执行隐式迁移 – 在最纯粹的版本中,除了启用自动迁移之外,您永远不需要执行任何操作
如果您正确启用了迁移,则还应该有一个名为Migrations的文件夹,其中包含一个
Configuration
类,其构造函数应如下所示(如果要启用自动迁移):public Configuration() { AutomaticMigrationsEnabled = true; }
-
基于代码的迁移
如果关闭自动迁移,则必须始终定义显式迁移,以便在明确定义的显式步骤中定义数据库升级过程。 这对于需要同时使用升级和降级到特定版本的情况特别有用。在这种情况下,您需要使用
Add-Migration
命令将此更改写入基于代码的迁移,以便您可以对其进行编辑。Add-Migration
命令允许您为这些迁移命名,例如Add-Migration AddSomeProperty
。执行该命令后,在Migrations文件夹中,您将有一个新的迁移文件,其名称已预先修复,并带有时间戳以帮助排序。
错误消息确切地说明了您需要做什么“使用代码优先迁移来生成更改脚本”。
- ASP.NET MVC重新编译限制达到了15个HostingEnvironment,启动了关闭HostingEnvironment导致关机
- Ninject.MVC5没有生成NinjectWebCommon.Cs
- MVC Bundling – 包含单个bundle的.min文件
- 如何禁用特定类的默认模型绑定
- 自定义validation属性,用于将my属性的值与模型类中的另一个属性值进行比较
- 通过VS 2015 RC进行非Azure部署
- WebAPI帮助页面 – 返回或参数模型/类属性的文档
- ASP.NET MVC:在程序集中找不到上下文类型
- 为什么System.Diagnostics.Debug.WriteLine在Visual Studio 2010 C#中不起作用?