我在EF5中有一个代码优先的实体模型。但是我想手动管理数据库更改-我不希望EF修改现有数据库及其所有数据。但是,当我在EF映射和数据库中进行并行更改时,EF拒绝正常运行,并告诉我需要先使用代码迁移。如何关闭此功能?
Answers:
将Database.SetInitializer设置为null。
public class DatabaseContext: DbContext
{
//the base accepts the name of the connection string provided in the web.config as a parameter
public DatabaseContext()
: base("DatabaseContext")
{
//disable initializer
Database.SetInitializer<DatabaseContext>(null);
}
__MigrationHistory
没有最新迁移的事实,并且您不想无论如何都要做。就我而言,我在开发环境中使用迁移,但是当我部署到生产环境时,我使用SSDT来更新数据库。因此,EF会抱怨模型已更改,因为它__MigrationHistory
没有最新的迁移,但我可以保证数据库已更新。
Database.SetInitializer
从构造函数移到类构造函数。这样可以确保仅进行一次呼叫。
因此,我找到的最完整的答案是:
Migrations
项目内的文件夹。Database.SetInitializer<DatabaseContext>(null);
在您的DatabaseContext初始化程序中进行设置。__MigrationHistory
数据库中的表。对于EF6 +,该表位于下方,Tables
而对于早期版本,该表位于下方System Tables
。__MigrationHistory
每次我的应用程序启动时检查是否存在,这会使我的应用程序启动时间增加几毫秒。有没有办法__MigrationHistory
完全禁用检查?
如果要完全关闭迁移:
https://stackoverflow.com/a/9709407/141172
但是,我发现最好保持启用代码优先迁移的功能,但是可以使用该-Script
选项让EF为我创建一个数据库更改脚本,该脚本可以手动应用于每个数据库(开发,QA,生产):
Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject
这样,EF将为我创建更改脚本,而我仍然完全可以控制正在应用的更改。我像其他任何源代码一样对变更脚本进行版本控制。
completely turn off migrations
。为此,请执行以下操作:添加Database.SetInitializer<YourContextType>(null)
到应用程序的启动中
如果您已经使用过Migrations,那么仅更改Initializer将无济于事。您需要转到Management Studio,打开数据库表,转到System Tables
文件夹并删除该__MigrationHistory
表所在的表(对于EF6及更高版本,它位于的正下方Tables
)。这将永久禁用迁移。
System Tables
。
sp_rename
。我也禁用了初始化程序。
我刚刚解决了这个“问题”
我的环境的配置如下
1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0
_MigrationHistory
自动创建新 表吗?