我正在使用手动数据库迁移。
目前,只要有任何新的存储过程或函数,我就会通过以下方法创建迁移:
Add-Migration CreatefnGenerateRequestCode
现在,框架已经创建了类CreatefnGenerateRequestCode
。
我有两个选项(据我所知),我可以编写内联create procedure
SQL代码,或者我可以从文件夹中读取SQL脚本。
我不喜欢内联方法,因为程序变得复杂,我不想保持连接字符串。
所以我发现的是我可以使用dll加载嵌入式资源的方法。
现在,我要做的是创建一个脚本文件
我有一个名为Scripts
的文件夹存储fnGenerateRequestCode.sql
,现在我已将其嵌入到dll中。
现在,在这段代码的帮助下,我从dll中读到了它:
private string GetFileCode(string resourceName)
{
var assembly = Assembly.GetExecutingAssembly();
string result;
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
result = reader.ReadToEnd();
}
}
return result;
}
我的整个迁移类看起来像这样:
public override void Up()
{
var resourceName = "CBA.RBS.CEDS.Data.Scripts.fnGenerateRequestCode.sql";
var inlinecode = this.GetFileCode(resourceName);
if (string.IsNullOrWhiteSpace(inlinecode)) { }
else
{
Sql(inlinecode);
}
}
public override void Down()
{
Sql("Drop function dbo.fnGenerateRequestCode");
}
但是这种方法的问题是每次我都有一个脚本要执行,我将不得不嵌入我不知道的DLL是否真的是一个很好的解决方案,因为dll将被加载到记忆,它最终会占用大量的内存空间。
我尝试了其他方法,但在执行Update-Database
时无法读取这些脚本文件。
我试过的一种方法是Copy to Output Directory
,但我认为我不能读到同样的错误:
PM> Update-database指定'-Verbose'标志以查看SQL 语句被应用于目标数据库。应用显式 迁移:[201410230234306_CreateFullBackupProcedure]。应用 显式迁移:201410230234306_CreateFullBackupProcedure。 System.IO.DirectoryNotFoundException:找不到部分内容 路径 'C:\用户\马勒姆\应用程序数据\本地\组件\ DL3 \ G787MA29.K3X \ JL3MCKQY.NGR \ 8b8db792 \ 7af63578_6beecf01 \脚本\ spFullBackup.sql'
。
有人可以澄清两件事: