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

时间:2017-04-10 18:48:55

标签: c# sql-server entity-framework code-first class-library

我在尝试使用代码优先的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);
        }
    }
}

但这没有任何影响。有没有人有其他想法?

由于

克里斯

1 个答案:

答案 0 :(得分:5)

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

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

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

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

您获得的NuGet package版本取决于您运行的Sql Server的版本。我的Sql Server版本是11.0.6020.0,因此我安装了NuGet package11.0.2版本。 非常重要以匹配版本。

您需要三个程序集。

  1. Microsoft.SqlServer.Types.dll
  2. msvcr<Version>.dll
  3. SqlServerSpatial<Version>.dll
  4. 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替换为121314而不会出现问题。< / p>

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

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