我想实现自定义数据库初始化策略,以便我可以:
提前致谢
答案 0 :(得分:2)
您需要实施IDatabaseInitializer界面。
例如
public class MyInitializer : IDatabaseInitializer<MyDbContext>
{
public void InitializeDatabase(MyDbContext context)
{
//your logic here
}
}
然后在应用程序启动时设置初始化程序
Database.SetInitializer<ProductCatalog>(new MyInitializer());
这是example
您必须手动执行命令才能更改数据库。
context.ObjectContext.ExecuteStoreCommand("ALTER TABLE dbo.MyTable ADD NewColumn VARCHAR(20) NULL");
您可以使用SQL Compare之类的工具编写更改脚本。
答案 1 :(得分:2)
有一个原因尚不存在。它非常复杂,而且IDatabaseInitializer
接口并没有为此做好准备(没有办法使这种初始化数据库不可知)。您的问题“太宽泛”,无法满足您的要求。你对@ Eranga的正确答案的反应你只是希望有人会告诉你如何做到这一点,但我们不会 - 这将意味着我们将为你编写初始化器。
你需要做什么你想做什么?
sys
个视图,并且必须知道如何查询它们以获取有关当前数据库结构的数据。即使ADO.NET团队也没有实现这一点,他们将来也不会实现它。相反,他们正在开展一项名为迁移的工作。
编辑:
确实ObjectContext
可以返回用于创建数据库的脚本 - 这正是默认初始值设定项正在使用的脚本。但它怎么能帮到你呢?您是否要解析该脚本以查看更改的内容?您是否要在另一个连接中执行该脚本以使用与当前数据库相同的代码来查看其结构?
是的,您可以创建一个新数据库,将数据从旧数据库移动到新数据库,删除旧数据库并重命名新数据库,但这是您可以想象的最愚蠢的解决方案,没有数据库管理员会允许这样做。即使这个解决方案仍然需要分析更改以创建正确的数据传输脚本。
自动升级是一种错误的方法。您应该始终使用某些工具手动准备升级脚本,对其进行测试,然后手动执行或作为某些安装脚本/包的一部分执行。您还必须备份数据库,然后才能进行任何更改。
答案 2 :(得分:2)