如何删除和创建仅在Code First - Entity Framework中更改的表

时间:2017-08-07 11:27:46

标签: c# .net sql-server entity-framework

我在实体框架中使用Code First方法。

我已经创建了一个自定义数据库初始化程序,如下所示。

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");
            }
        }
    }

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

我需要做的是删除并创建在代码中更改的表/实体 喜欢 - 添加或删除任何列等。

无论如何我们可以这样做吗?

非常感谢任何指导。

3 个答案:

答案 0 :(得分:1)

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

  1. 打开程序包管理器控制台(工具 - &gt;库程序包管理器 - &gt;程序包管理器控制台)
  2. 运行启用迁移命令
  3. 更改模型
  4. 在程序包管理器控制台中运行添加迁移命令。
  5. 运行 Update-Database 命令,将模型更改应用于数据库。
  6. 当然,您不应该使用自定义数据库初始化程序。

答案 1 :(得分:0)

最简单的解决方案是在您的上下文构造函数中添加此初始化:

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

每次运行程序时,都会根据数据库检查模型,如果模型已被修改,则自动删除并重新创建数据库。

如果您不想删除数据库,只需更新数据库,那么您可以使用以下初始化:

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

但请注意,这些都不适用于Entity Framework Core ,因为Microsoft并不打算为.Net Core版本实现自动迁移。

答案 2 :(得分:0)

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

更新数据库-targetMigration“MigrationName”

上面的命令会恢复所有数据库更改,无论您在EF迁移过程中应用了什么。