.net - 在控制台应用程序中使用实体框架运行一系列脚本 (.sql) 文件
问题描述
我的 .net 控制台应用程序中有 5 个 .sql 脚本文件,每个脚本文件代表一个步骤。我想使用实体框架执行它们中的每一个 注意我的脚本文件中有 INSERT、GO、SET IDENTITY_INSERT、ALTER TABLE 语句
Example sql file 1
--Add divsional settings
DECLARE @DIVISIONID int= 29 --Roadshow hardocing it because it may b use somewhere in the code
DECLARE @US_DIVISION_PROFILEID INT = 1;
DECLARE @CANADA_DIVISION_PROFILEID INT = 2;
DECLARE @GLOBALSITEID INT =1
DECLARE @DATE DATETIME= GETDATE()
EXEC spInsertPayWeeks @GLOBALSITEID,@DATE
--Generate (current,previous,next) wo week rotation set monday as a first day of rotation
DECLARE @PREVIOUS_ROTATION_START DATETIME= DATEADD(wk, DATEDIFF(wk, 13, GETDATE()), 0)
DECLARE @PREVIOUS_ROTATION_END DATETIME= dateadd(dd,13,@PREVIOUS_ROTATION_START) --Add 13 days to rotation
DECLARE @CURRENT_ROTATION_START DATETIME= DATEADD(wk, DATEDIFF(wk, 5, GETDATE()), 0)
DECLARE @CURRENT_ROTATION_END DATETIME= dateadd(dd,13,@CURRENT_ROTATION_START) --Add 13 days to rotation
DECLARE @NEXT_ROTATION_START DATETIME= DATEADD(wk, DATEDIFF(wk, -13, GETDATE()), 0)
DECLARE @NEXT_ROTATION_END DATETIME= dateadd(dd,13,@NEXT_ROTATION_START) --Add 13 days to rotation
---insert division profile rotation
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@US_DIVISION_PROFILEID,@PREVIOUS_ROTATION_START,@PREVIOUS_ROTATION_END)
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@US_DIVISION_PROFILEID,@CURRENT_ROTATION_START,@CURRENT_ROTATION_END)
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@US_DIVISION_PROFILEID,@NEXT_ROTATION_START,@NEXT_ROTATION_END)
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@CANADA_DIVISION_PROFILEID,@PREVIOUS_ROTATION_START,@PREVIOUS_ROTATION_END)
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@CANADA_DIVISION_PROFILEID,@CURRENT_ROTATION_START,@CURRENT_ROTATION_END)
INSERT INTO DivisionProfileRotation(DivisionProfileID,StartDate,EndDate) VALUES (@CANADA_DIVISION_PROFILEID,@NEXT_ROTATION_START,@NEXT_ROTATION_END)
DECLARE @ICD_OFFICE_CORPORATION_ADDRESS_ID_ONE INT= 1;
DECLARE @ICD_OFFICE_CORPORATION_ADDRESS_ID_TWO INT = 2;
--Set up two corporation with each office
ALTER TABLE [dbo].[IcdCorporation] NOCHECK CONSTRAINT ALL;
ALTER TABLE [dbo].[IcdOffice] NOCHECK CONSTRAINT ALL;
解决方案
我使用实体框架自己尝试了一些东西,它对我有用。我希望它可以帮助某人。
这是我的助手类,它处理我需要的所有额外功能:
public static class Helper
{
private const string SCRIPT_FOLDER = @"\Scripts\";
public static string GetSqlStatmentsFromFile(string filename)
{
var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + SCRIPT_FOLDER;
if (Directory.Exists(folderPath) && File.Exists(folderPath + filename))
{
using (StreamReader reader = new StreamReader(folderPath + filename))
{
return reader.ReadToEnd();
}
}
return string.Empty;
}
public static string UpdateSqlParameters(IDictionary<string, string> parameters, string sql)
{
var sqlString = new StringBuilder(sql);
foreach (var param in parameters)
{
sqlString = sqlString.Replace(param.Key, param.Value);
}
return sqlString.ToString();
}
}
这是我的 Program.cs
class Program
{
public const int GLOBAL_SITE_ID = 1;
static void Main(string[] args)
{
ExecuteSteps();
}
private static void ExecuteSteps()
{
//My entity framework context
TestEntities context=new TestEntities();
foreach (var step in GetSteps())
{
Console.WriteLine(step.StepName + "...");
if (step.IsScript && !string.IsNullOrEmpty(step.ScriptFilePath))
{
var sql = Helper.UpdateSqlParameters(GetGlobalParameters(), Helper.GetSqlStatmentsFromFile(step.ScriptFilePath));
context.Database.ExecuteSqlCommand(sql);
}
Console.WriteLine(step.StepName + " Completed.");
}
}
private static IEnumerable<Step> GetSteps()
{
return new List<Step>
{
new Step{ StepName = "Cleaning Database", IsScript =true, ScriptFilePath="CleanDatabase.sql"},
new Step{ StepName = "Filling master data into database", IsScript =true, ScriptFilePath="FillMasterData.sql"},
new Step{ StepName = "Adding default data to the system", IsScript =true, ScriptFilePath="AddDefaultData.sql"},
new Step{ StepName = "Adding menus", IsScript =true, ScriptFilePath="AddMenusAndPermissions.sql"},
};
}
private static IDictionary<string, string> GetGlobalParameters()
{
return new Dictionary<string, string>
{
{"@_GLOBAL_SITE_ID",GLOBAL_SITE_ID.ToString() }
};
}
}
请注意,脚本文件位于应用程序的脚本文件夹中,其中的 sql 文件被定义为复制到 bin 文件夹,并且它们的构建操作是内容
推荐阅读
- powershell - pg_ctl.exe 无法以自定义 postgresql.conf 启动
- mysql - (MySQL)以某种方式命名数据库默认值并且根本无法使用它,因为 MySQL 工作台认为我使用默认数据tyoe
- javascript - 为什么元素 getBoundingClientRect() 值条件无法正常工作?
- python - Python ValueError:没有足够的值来解包(预期 2,得到 1)
- python - 在字典中查找数字并在 python 中打印
- objective-c - 以编程方式获取在 Safari 或 Google chrome 中打开的选项卡的标题或数量
- terminal - 在 linux mint 从终端更新软件包时出错
- asp.net-core - 使用 Azure AD 身份验证时访问我的应用服务中的特定 URL
- r - Is there an R function to combine multiple columns from the same data frame into the same column?
- laravel - 根据另一个字段的值显示/隐藏字段