2015-11-16 19 views
0

我試圖創建生成自動化目的的SQL遷移腳本控制檯應用程序 - 所產生的同一個腳本:如何通過反射來引用另一個項目中的EF配置?

更新,數據庫-Script

從軟件包管理器控制檯。

在我創建了,如果我直接引用的DLL有我的DBMigrationsConfiguration它我可以生成腳本的控制檯應用程序。

例如這個工程:

using System.Data.Entity.Migrations; 
using System.Data.Entity.Migrations.Infrastructure; 
using System.IO; 
using TAPS.Infrastructure.Migrations; 

namespace msg 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var migrator = new DbMigrator(new Configuration()); 
      var scriptor = new MigratorScriptingDecorator(migrator); 
      var sql = scriptor.ScriptUpdate(null, null);    
      File.WriteAllText(@"c:\script.sql", sql); 
     } 
    } 
} 

請注意,我有一個直接引用的DLL,using語句,我用一個新的語句來實例化配置對象。

現在,如果我嘗試通過反射來做到這一點,我回去空從線路:

DbMigrationsConfiguration configuration = (DbMigrationsConfiguration)assembly.CreateInstance("TAPS.Infrastructure.Migrations, Configuration");    

完整的代碼示例如下,我試圖得到通過反射工作:

using System; 
using System.Data.Entity.Migrations; 
using System.Data.Entity.Migrations.Infrastructure; 
using System.IO; 
using System.Reflection; 

namespace msg 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"C:\DLLPath\TAPS.Infrastructure.dll")); 
      DbMigrationsConfiguration configuration = (DbMigrationsConfiguration)assembly.CreateInstance("TAPS.Infrastructure.Migrations, Configuration");    
      var migrator = new DbMigrator(configuration); 
      var scriptor = new MigratorScriptingDecorator(migrator); 
      var sql = scriptor.ScriptUpdate(null, null);    
      File.WriteAllText(@"c:\script.sql", sql); 
     } 
    } 
} 

配置變量返回爲空。

+1

刪除你的屏幕捕獲和直接複製粘貼在這裏你的代碼,請。 – CodeNotFound

+0

CodeNotFound - 我試圖顯示添加DLL引用,但我繼續並拿出屏幕截圖並添加了代碼。 –

回答

1

如果配置類型是在TAPS.Infrastructure.Migrations命名空間,你需要得到它這樣與反思,你正在使用的語法是錯誤的。

var foo = assembly.CreateInstance("TAPS.Infrastructure.Migrations.Configuration"); 

試試這個循環遍歷裝載的程序集中的所有類型,名稱必須匹配。

foreach (var type in assembly.GetTypes()) 
{ 
    Console.WriteLine(type); 
} 
+0

如果我嘗試這樣做,GetTypes()會給我一個錯誤:{「無法加載一個或多個請求的類型,檢索LoaderExceptions屬性獲取更多信息。」} 在LoaderExceptions中,它引用另一個DLL已經嘗試使用AppDomain.CurrentDomain.Load加載,但這不能解決問題。奇怪的是,如果我只是添加一個引用,我只需要一個DLL。建議? –

+0

TAPS.Infrastructure.Migrations的參考很可能是Copy to Local = true,因此所有需要的dll都會被複制,是否有一些類型在配置中使用?這兩個應用程序是否使用相同版本的實體框架和目標框架? –

+0

我看到你現在說的話 - 當我將這個單引用添加到我的控制檯應用程序時,它也將其他DLL添加到我的後臺的BIN目錄中。我想我的問題是現在 - 我怎麼自動加載這些呢? 如果我只是加入額外的AppDomain負載,如: AppDomain.CurrentDomain.Load(File.ReadAllBytes(@「C:\ Development \ eTaps \ Dev \ Source \ TAPS.Web \ bin \ TAPS.Core。dll「)); 它仍然說,當我嘗試CreateInstance時,Taps.Core.Dll沒有加載。 –

相關問題