Chr*_*isB 2 c# sql-server entity-framework class-library code-first
我有一些问题试图获得代码优先的Entity Framework 6.0来构建迁移Microsoft.SQLServer.Types.我还是继续说:
空间类型和函数不适用于此提供程序,因为无法找到程序集"Microsoft.SqlServer.Types"版本10或更高版本.
我看到他们一直在谈论跑步:
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Run Code Online (Sandbox Code Playgroud)
或类似的global.asax.我需要在一个处理我的应用程序的数据层的类库中运行它,因此没有启动事件.
我投入了
[assembly: PreApplicationStartMethod(typeof(Test.Startup), "Start")]
namespace Test
{
public class Startup
{
public static void Start()
{
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这没有任何效果.有人有任何其他想法吗?
谢谢
克里斯
哦!我上周才遇到这个问题!
让我们首先澄清一些事情.此错误是由于缺少管理Sql Server Spatial类型的程序集引起的.您可以通过以下方式解决此问题:
通常情况下,使用NuGet包更容易,所以我将解释一下.
您获得的NuGet包的版本取决于您运行的Sql Server的版本.我的Sql Server版本是11.0.6020.0,所以我安装11.0.2了NuGet包的版本.这对于匹配版本非常重要.
有3级,您需要的组件.
Microsoft.SqlServer.Types.dllmsvcr<Version>.dllSqlServerSpatial<Version>.dllMicrosoft.SqlServer.Types.dll是一个托管程序集,而另外两个是本机程序集.
如果您安装了正确版本的NuGet包,那么应该为您处理所有这些.
安装NuGet包后,它将打开自述文件,并提供有关如何使用Loader该类加载本机程序集的示例.
代码示例:
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Run Code Online (Sandbox Code Playgroud)
最后,您需要覆盖静态类中的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"
Run Code Online (Sandbox Code Playgroud)
如果您使用SQL Server的新版本,你应该能够取代11有12,13或者14没有问题.
如果它不起作用,这里有一个快速清单:
Microsoft.SqlServer.Types.dll引用...\SqlServerTypes\<Platform>\文件夹下的bin目录中.应该有两个.LoadNativeAssemblies和设置任何数据库操作SqlServerTypesAssemblyName 之前,包括创建DbContext实例.Microsoft.SqlServer.Types程序集.它可能无法通过构建/引用过程进行复制.