解決 Microsoft.SqlServer.Types 參考使用的問題
透過 Entity Framework 使用 SQL Server 的空間資料 (DbGeography) 相當便利,但是需要 Microsoft.SqlServer.Types 參考,而有時參考後又出現問題。
Exception 訊息:
System.InvalidOperationException
HResult=0x80131509
Message=Spatial types and functions are not available for this provider because the > assembly ‘Microsoft.SqlServer.Types’ version 10 or higher could not be found.
Source=EntityFramework.SqlServer
Microsoft.SqlServer.Types 安裝
透過 Nuget 安裝 Microsoft.SqlServer.Types 套件,可以透過介面安裝或是透過指令安裝,安裝指令如下:
1 | Install-Package Microsoft.SqlServer.Types |
安裝好之後,請仔細閱讀 readme.htm ,其中說明如何將套件註冊進程式中
ASP.NET Web Sites
在 Web Form 中,開啟 Default.aspx.cs
1 | public partial class _Default : System.Web.UI.Page |
ASP.NET Web Applications
開啟 Global.asax.cs 添加以下程式碼:
1 | SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin")); |
Desktop Applications
在執行空間操作前執行以下程式碼:
1 | SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); |
解決引用錯誤
就如同此文一開始所提到的 exception,按照Microsoft.SqlServer.Types套件的說明註冊引用,有時還是會出現問題,可能是 Entity Framework 版本因素或是伺服器沒有對應版本的Microsoft.SqlServer.Types或是沒有註冊引用到;stack overflow 此篇的討論方法可以解決我此次遇到的問題
- 方法一
添加參照
1 | SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName; |
- 方法二
直接在 config 檔案中進行參照,需要注意版本號
1 | <assemblyBinding> |
取得 PublicKeyToken
[Microsoft.SqlServer.Types] 的 DLL 的路徑,可以從以下路徑查找
1 | C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types |
根據以上的 DLL 取得 PublicKeyToken 的方式,可以透過 powershell
1 | ([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName |