sql - 从ASP.NET MVC中的现有数据库生成种子代码

标签 sql asp.net-mvc-4 etl entity-framework-migrations

我想知道是否有人遇到过类似的挑战:

我有一个数据库,其中包含一些从Excel文件进​​行ETL(导入和转换)的数据。在我的ASP.NET MVC Web应用程序中,我使用“代码优先”方法,并在每次数据库更改时都删除/创建:

#if DEBUG
  Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDataContext>());
#endif

但是,由于数据库中的数据丢失,因此我不得不再次将其ETL,这很烦人。

因为,仅在更改模型时才会删除数据库,所以无论如何我都必须调整ETL。但是我宁愿更改我的数据库种子代码。

假设模型和SQL表都是最新的,是否有人知道如何获取数据库的内容并生成种子代码?

编辑1:
我打算使用自动生成的Configuration.cs及其种子方法,然后使用AddOrUpdate()方法将数据添加到数据库中:这是Microsoft's Tutorial on migrations(特别是“设置种子方法”部分)。

最佳答案

播种数据的另一种方法是在Up迁移中将其作为sql运行。

我有将读取一个SQL文件并运行它的代码

using System;
using System.Data.Entity.Migrations;
using System.IO;

public partial class InsertStandingData : DbMigration
{
    public override void Up()
    {
        var baseDir = AppDomain.CurrentDomain
                               .BaseDirectory
                               .Replace("\\bin", string.Empty) + "\\Data\\Sql Scripts";

        Sql(File.ReadAllText(baseDir + "\\StandingData.sql"));
    }

    public override void Down()
    {
        //Add delete sql here
    }
}

因此,如果您的ETL为您生成了sql,则可以使用该技术。

在Up方法中执行此操作的优点是
  • 这比使用AddOrUpdate更快,因为AddOrUpdate每次调用数据库获取任何内容时都会查询数据库
    已经存在的实体。
  • 您通常是从已知状态(例如空表)进入的,因此您可能
    不需要检查数据是否已经存在。注意,要确保这一点
    那么您应该删除Down方法中的数据,以便您可以
    一直撕下来,然后再次抬起。
  • Up方法不会在每次应用程序启动时运行。

  • Seed方法提供了便利-它具有(!?)优点,它可以在应用程序每次启动时运行

    但是,如果您希望从那里运行sql,请使用ExecuteSqlCommand而不是Sql:
    string baseDir = AppDomain.CurrentDomain.BaseDirectory.Replace("\\bin", string.Empty) 
                  + "\\Data\\Sql Scripts";
    string path = Path.Combine(baseDir, "StandingData");
    foreach (string file in Directory.GetFiles(path, "*.sql"))
    {
        context.Database.ExecuteSqlCommand(File.ReadAllText(file));
    }
    

    引用:

    Best way to incrementally seed data

    Preparing for database deployment

    Database Initializer and Migrations Seed Methods

    关于sql - 从ASP.NET MVC中的现有数据库生成种子代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19228056/

    相关文章:

    asp.net-mvc - NuGet将恶意行添加到web.config MVC4

    sql-server - 将 DT_DBTIMESTAMP2 类型的列映射到 SQL Server 中的 datetime2 时,发生转换规范错误的无效字符值

    php - 将日期值插入 MySQL

    sql - Oracle TO_DATE 不抛出错误

    c# - ApiController 能否返回一个包含其他对象集合的对象?

    c# - 执行处理程序的子请求时出错 - 从 Controller 调用的部分 View

    MySQL - 行到列

    java - 直接 Java/Groovy 与 ETL 工具(Talend/等)——你会使用什么库?

    mysql - 在mysql中插入时格式化日期

    mysql - 我可以在 GROUP BY 和 ORDER BY 上强制使用 2 个单独的索引吗?