如何删除和创建仅在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"); 
      } 
     } 
    } 

根据上面的代码,数据库中的所有表都被删除并重新创建。

我需要做的是删除并创建表/实体,在代码 变了样 - 添加或删除任何列等

反正我们能做到这一点?

任何指导,非常感谢。

+0

为什么不使用[迁移](https://msdn.microsoft.com/en-us/library/jj591621(v = vs.113).aspx)? –

+0

@ IvanR.I从未使用迁移。如果你能指导我如何实现迁移来找到我的问题的解决方案,那就太好了。谢谢 –

您可以使用migrations更新数据库方案。

  1. 打开包管理器控制台(工具 - >库包管理器 - >程序包管理器控制台)
  2. 运行启用迁移命令
  3. 更改模型
  4. 运行添加迁移命令在包管理器控制台中。
  5. 运行更新数据库命令将您的模型更改应用于数据库。

当然,你不应该使用你的自定义数据库初始值设定项。

+0

添加到您的答案。要使初始迁移工作,您的数据库应该为空/未创建。 –

最简单的解决办法是这个初始化添加到您在您的上下文的构造函数:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>()); 

这将在每次运行程序时检查你对数据库模型,并自动删除并重新创建数据库如果模型已被修改。

如果你不想删除数据库,并只对其进行更新,那么你可以使用下面的初始化:但是

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>()); 

被告知,没有这些工作,在实体框架的核心,因为微软没有也不打算实施.Net Core版本的自动迁移。

+0

我试过这个。但现在的变化并没有反映在数据库中。我添加了新的实体,但表不是为实体创建的。 –

+0

当我执行项目时,它会抛出错误说“数据库中已经有一个名为'xyz'的对象。” –

+0

@DheerajKumar修改现有实体是否工作?我认为这些初始化只更新现有的表,但不创建新的表。 – stybl

您可以恢复到通过更新数据库应用的初始迁移。

更新数据库-targetMigration“MigrationName”

上面的命令恢复无论你已经申请为EF迁移的一部分,所有的数据库变化。