我在尝试使用代码优先的Entity Framework 6.0来构建使用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);
}
}
}
但这没有任何影响。有没有人有其他想法?
由于
克里斯
答案 0 :(得分:5)
噢!我上周才遇到这个问题!
让我们首先澄清一些事情。此错误是由于缺少管理Sql Server Spatial类型的程序集引起的。您可以通过以下任一方式解决此问题:
通常,使用NuGet包更容易,所以我将解释一下。
您获得的NuGet package版本取决于您运行的Sql Server的版本。我的Sql Server版本是11.0.6020.0
,因此我安装了NuGet package的11.0.2
版本。 非常重要以匹配版本。
您需要三个程序集。
Microsoft.SqlServer.Types.dll
msvcr<Version>.dll
SqlServerSpatial<Version>.dll
Microsoft.SqlServer.Types.dll
是托管的程序集,而其他两个是 native 程序集。
如果您安装了NuGet软件包的正确版本,那么应该为您处理所有这些。
安装NuGet包后,它将打开自述文件,并提供有关如何使用Loader
类加载本机程序集的示例。
代码示例:
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
最后,您需要覆盖SqlServerTypesAssemblyName
静态类中的SqlProviderServices
属性。 注意,这仅适用于更高版本的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,则应该可以将11
替换为12
,13
或14
而不会出现问题。< / p>
如果它不起作用,这里有一个快速清单:
Microsoft.SqlServer.Types.dll
。..\SqlServerTypes\<Platform>\
文件夹下的bin目录中。应该有两个。LoadNativeAssemblies
并在之前设置SqlServerTypesAssemblyName
任何数据库操作,包括创建DbContext实例。Microsoft.SqlServer.Types
程序集。它可能无法通过构建/引用过程进行复制。