2016-08-25 4 views
0

私はASP.NET Web APIプロジェクトを持っています。私はEntity Framework Migrationsを使用しています。現在、移行中に実行されるカスタムスクリプトがあります。私はこのためにSQLFILE方法を使用しています:Entity Frameworkの移行:ASP.NET内のSQLファイルにアクセス

SqlFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Migrations/Scripts/MyCustomScript.sql")); 

私は「常にコピー」スクリプトへの「出力ディレクトリにコピーする」に設定するとこれは、統合テストでは正常に動作します。

ただし、ウェブサイトを実行すると、<websiteroot>\bin\Migrations\MyCustomScript.sqlにコピーされ、AppDomain.CurrentDomain.BaseDirectoryはwebsiterootを指します。したがって、スクリプトが見つからないというエラーがスローされます。スクリプトはルートではなく、binフォルダにあります。

テストと実際のウェブサイトの両方で動作するようにスクリプトをロードするにはどうすればよいですか?

答えて

2

それを修正するでしょう。あなたはif文を必要とせず、正しいスクリプトが含まれていることを常に知っています。ビルドアクションを組み込みリソースに設定します。あなたのようなスクリプトを得ることができます次に:

Assembly assembly = Assembly.LoadFile(dll); 
using (Stream stream = assembly.GetManifestResourceStream(resourcepath)) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    string script = reader.ReadToEnd(); 
+0

私はこれにそれを作った:Assembly.GetExecutingAssembly()GetManifestResourceStream(resourceNameは)とブラケットを閉じたが、それ以外:良い解決策! – fikkatra

+0

いいえ、それはファイルを埋め込んだ場所によって異なります。これはあなたを助けてくれる良いことです! – Peter

1

私はDLLと直接DLLからスクリプトをロードするよりも、あなたのスクリプトが含まれます。この方法(それが最善の方法ではないのですが、それは方法です)

string sqlfilepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Migrations/Scripts/MyCustomScript.sql"); 
if (!File.Exists(sqlfilepath)) 
    sqlfilepath = "your other path where it might exist"; 
関連する問題