2017-04-10 90 views
2

我有幾個問題試圖獲得代碼優先的實體框架6.0與Microsoft.SQLServer.Types建立遷移。我仍然繼續獲得:類庫,實體框架代碼第一和Microsoft.SqlServer.Types

空間類型和函數不適用於此提供程序,因爲無法找到程序集「Microsoft.SqlServer.Types」版本10或更高版本。

我到處看看他們一直在談論跑步:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); 

global.asax相似。我需要在處理我的應用程序的數據層的類庫中運行它,所以沒有啓動事件。

我已經把

[assembly: PreApplicationStartMethod(typeof(Test.Startup), "Start")] 
namespace Test 
{ 
    public class Startup 
    { 
     public static void Start() 
     { 
      SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); 
     } 
    } 
} 

但是,這並沒有任何效果。任何人有任何其他想法?

感謝

克里斯

回答

5

哦!上週我剛剛遇到了這個問題!

讓我們從澄清幾件事開始。這個錯誤是由於缺少一個程序集來管理Sql Server Spatial類型而導致的。您可以通過解決此問題:

  • 機器
  • 取了NuGet包的依賴上安裝SQL Server。

通常,使用NuGet包更容易,所以我要解釋一下。

你得到的NuGet package的版本取決於你運行的Sql Server的版本。我的Sql Server版本是11.0.6020.0,所以我安裝了11.0.2版本的NuGet package。這是超級重要以匹配版本。

還有三個組件,您將需要。

  1. Microsoft.SqlServer.Types.dll
  2. msvcr<Version>.dll
  3. SqlServerSpatial<Version>.dll

Microsoft.SqlServer.Types.dll管理組件,而其他兩個是天然組件。

如果您安裝了的正確版本的NuGet包,那麼所有這些都應該爲您處理。

安裝完NuGet包後,它會打開一個自述文件,它給出瞭如何使用Loader類加載本機程序集的示例。

代碼示例:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); 

最後,你需要重寫的SqlProviderServices靜態類的SqlServerTypesAssemblyName屬性。 注意,這隻適用於更高版本的EntityFramework。我正在使用EntityFramework 6.1.3。在我的研究中,其他人說這在早期版本中不可用。

再次,我用的版本11.0.2符合我的SQL Server版本,所以我用下面的代碼:

SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 

如果您使用SQL Server的新版本,你應該能夠用121314代替11,沒有問題。

如果它不工作,這裏有一個快速清單:

  • 確保Microsoft.SqlServer.Types.dll引用。
  • 確保將本地組件複製到..\SqlServerTypes\<Platform>\文件夾下的bin目錄中。應該有兩個
  • 確保您正在調用LoadNativeAssemblies並在之前設置SqlServerTypesAssemblyName之前的任何數據庫操作,包括創建您的DbContext實例。
  • 如果您的DbContext是在執行程序集的獨立程序集中,您可能需要以參考Microsoft.SqlServer.Types程序集。它可能不會通過構建/引用過程被複制。
+1

天才,工作就像一個魅力。謝謝克里斯 – ChrisB

相關問題