C# 编写存储过程脚本,代码优先实体框架中的函数
我正在使用手动数据库迁移 目前,只要有任何新的存储过程或函数,我都会通过以下方法创建迁移:C# 编写存储过程脚本,代码优先实体框架中的函数,c#,.net,entity-framework,entity-framework-migrations,C#,.net,Entity Framework,Entity Framework Migrations,我正在使用手动数据库迁移 目前,只要有任何新的存储过程或函数,我都会通过以下方法创建迁移: Add-Migration CreatefnGenerateRequestCode 现在,框架已经创建了类CreatefnGenerateRequestCode 我有两个选择(据我所知),要么写内联create过程SQL代码,要么从文件夹中读取SQL脚本 我不喜欢内联方法,因为随着过程变得复杂,我不想继续连接字符串 所以我发现了一种方法,通过这种方法我可以用dll加载嵌入式资源 现在,我要做的是创建一个
Add-Migration CreatefnGenerateRequestCode
现在,框架已经创建了类CreatefnGenerateRequestCode
我有两个选择(据我所知),要么写内联create过程
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将被加载到内存中,它最终会占用大量内存空间
我尝试过其他方法,但在执行updatedatabase
时无法读取这些脚本文件
我尝试的一种方法是复制到输出目录
,但我认为我读不到与以下错误相同的内容:
PM>Update database指定“-Verbose”标志以查看SQL
正在应用于目标数据库的语句。应用显式
迁移:[201410230234306_CreateFullBackupProcedure]。应用
显式迁移:201410230234306_CreateFullBackupProcedure。
System.IO.DirectoryNotFoundException:找不到
路径
“C:\Users\MalhAm\AppData\Local\assembly\dl3\G787MA29.K3X\JL3MCKQY.NGR\8b8db792\7af63578\U 6beecf01\Scripts\spFullBackup.sql”
有人能澄清两件事吗
我也有同样的问题,我决定使用“复制到输出目录”。