我想知道是否有人遇到过类似的挑战:
我有一个数据库,其中包含一些从Excel文件进行ETL(导入和转换)的数据。在我的ASP.NET MVC Web应用程序中,我使用“代码优先”方法,并在每次数据库更改时都删除/创建:
#if DEBUG
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDataContext>());
#endif
但是,由于数据库中的数据丢失,因此我不得不再次将其ETL,这很烦人。
因为,仅在更改模型时才会删除数据库,所以无论如何我都必须调整ETL。但是我宁愿更改我的数据库种子代码。
假设模型和SQL表都是最新的,是否有人知道如何获取数据库的内容并生成种子代码?
编辑1:我计划使用自动生成的Configuration.cs及其种子方法,然后使用AddOrUpdate()
方法将数据添加到数据库中:这是Microsoft的迁移教程(特别是“设置种子方法”部分) )。
播种数据的另一种方法是在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
方法中的数据,以便可以将其撕裂并再次备份。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));
}
参考:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句