Arm*_*tov 7 sql etl asp.net-mvc-4 ef-migrations
我想知道是否有人遇到过类似的挑战:
我有一个数据库,其中包含从Excel文件中ETL(导入和转换)的一些数据.在我的ASP.NET MVC Web应用程序中,我正在使用Code First方法并在每次数据库更改时删除/创建:
#if DEBUG
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDataContext>());
#endif
Run Code Online (Sandbox Code Playgroud)
但是,由于数据库中的数据丢失了,我必须再次ETL,这很烦人.
因为,DB只会在模型更改时被删除,所以无论如何我都要调整我的ETL,我知道.但我宁愿改变我的数据库种子代码.
假设模型和SQL表都是最新的,有谁知道如何获取数据库的内容并生成种子代码?
编辑1:
我打算使用自动生成的Configuration.cs及其Seed方法,然后使用AddOrUpdate()方法将数据添加到数据库中:这是Microsoft的迁移教程(特别是"设置种子方法"部分).
假设我们有一个简单的数据库表,其中包含3750条记录;
| Id | Age | FullName |
|------|-----|-----------------|
| 1 | 50 | Michael Jackson |
| 2 | 42 | Elvis Presley |
| 3 | 48 | Whitney Houston |
| ... | ... | ... |
| 3750 | 57 | Prince |
Run Code Online (Sandbox Code Playgroud)
我们希望使用自动生成的Configuration.cs文件及其Seed()方法在数据库中创建此表.
protected override void Seed(OurDbContainer context)
{
context.GreatestSingers.AddOrUpdate(
p => p.Id,
new GreatestSinger { Id = 1, Age = 50, FullName = "Michael Jackson" },
new GreatestSinger { Id = 2, Age = 42, FullName = "Elvis Presley" },
new GreatestSinger { Id = 3, Age = 48, FullName = "Whitney Houston" }
);
}
Run Code Online (Sandbox Code Playgroud)
这是你应该做的.3750次!
但是您已经在现有数据库表中拥有此数据.因此,我们可以使用此现有数据来创建Seed()代码.
在SQL String Concatenation的帮助下;
SELECT
CONCAT('new GreatestSinger { Id = ', Id ,', Age = ', Age ,', FullName = "', FullName ,'" },')
FROM GreatestSinger
Run Code Online (Sandbox Code Playgroud)
将为我们提供创建3750行数据所需的所有代码.
只需将其复制/粘贴到Seed()方法中即可.并从Package Manager Console ;
Add-Migration SeedDBwithSingersData
Update-Database
Run Code Online (Sandbox Code Playgroud)
播种数据的另一种方法是在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
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您的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));
}
Run Code Online (Sandbox Code Playgroud)
参考文献: