类库,实体框架代码优先和Microsoft.SqlServer.Types

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)

但这没有任何效果.有人有任何其他想法吗?

谢谢

克里斯

Cam*_*ron 6

哦!我上周才遇到这个问题!

让我们首先澄清一些事情.此错误是由于缺少管理Sql Server Spatial类型的程序集引起的.您可以通过以下方式解决此问题:

  • 在计算机上安装SQL Server
  • 依赖于NuGet包.

通常情况下,使用NuGet包更容易,所以我将解释一下.

您获得的NuGet包的版本取决于您运行的Sql Server的版本.我的Sql Server版本是11.0.6020.0,所以我安装11.0.2NuGet包的版本.这对于匹配版本非常重要.

3级,您需要的组件.

  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);
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的新版本,你应该能够取代1112,13或者14没有问题.

如果它不起作用,这里有一个快速清单:

  • 确保Microsoft.SqlServer.Types.dll引用.
  • 确保将本程序集复制到该..\SqlServerTypes\<Platform>\文件夹下的bin目录中.应该有两个.
  • 确保您正在设置调用LoadNativeAssemblies和设置任何数据库操作SqlServerTypesAssemblyName 之前,包括创建DbContext实例.
  • 如果DbContext位于与执行程序集不同的程序集中,则可能需要引用Microsoft.SqlServer.Types程序集.它可能无法通过构建/引用过程进行复制.