如何删除和创建仅在Code First - Entity Framework中更改的表格
我在实体框架中使用Code First方法。如何删除和创建仅在Code First - Entity Framework中更改的表格
我已经创建了如下的自定义数据库初始值设定项。
public class CustomInit : IDatabaseInitializer<APIContext>
{
public void InitializeDatabase(APIContext context)
{
bool dbExists;
dbExists = context.Database.Exists();
if (dbExists)
{
// remove all tables
context.Database.ExecuteSqlCommand(
"EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");
// create all tables
var dbCreationScript = ((IObjectContextAdapter)
context).ObjectContext.CreateDatabaseScript();
context.Database.ExecuteSqlCommand(dbCreationScript);
context.SaveChanges();
}
else
{
throw new ApplicationException("No database is present");
}
}
}
根据上面的代码,数据库中的所有表都被删除并重新创建。
我需要做的是删除并创建表/实体,在代码 变了样 - 添加或删除任何列等
反正我们能做到这一点?
任何指导,非常感谢。
您可以使用migrations更新数据库方案。
- 打开包管理器控制台(工具 - >库包管理器 - >程序包管理器控制台)
- 运行启用迁移命令
- 更改模型
- 运行添加迁移命令在包管理器控制台中。
- 运行更新数据库命令将您的模型更改应用于数据库。
当然,你不应该使用你的自定义数据库初始值设定项。
添加到您的答案。要使初始迁移工作,您的数据库应该为空/未创建。 –
最简单的解决办法是这个初始化添加到您在您的上下文的构造函数:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
这将在每次运行程序时检查你对数据库模型,并自动删除并重新创建数据库如果模型已被修改。
如果你不想删除数据库,并只对其进行更新,那么你可以使用下面的初始化:但是
Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>());
被告知,没有这些工作,在实体框架的核心,因为微软没有也不打算实施.Net Core版本的自动迁移。
我试过这个。但现在的变化并没有反映在数据库中。我添加了新的实体,但表不是为实体创建的。 –
当我执行项目时,它会抛出错误说“数据库中已经有一个名为'xyz'的对象。” –
@DheerajKumar修改现有实体是否工作?我认为这些初始化只更新现有的表,但不创建新的表。 – stybl
您可以恢复到通过更新数据库应用的初始迁移。
更新数据库-targetMigration“MigrationName”
上面的命令恢复无论你已经申请为EF迁移的一部分,所有的数据库变化。
为什么不使用[迁移](https://msdn.microsoft.com/en-us/library/jj591621(v = vs.113).aspx)? –
@ IvanR.I从未使用迁移。如果你能指导我如何实现迁移来找到我的问题的解决方案,那就太好了。谢谢 –