Class 图书馆,Entity Framework Code First & Microsoft.SqlServer.Types

Class Library, Entity Framework Code First & Microsoft.SqlServer.Types

我在尝试获取代码优先 Entity Framework 6.0 以使用 Microsoft.SQLServer.Types 构建迁移时遇到了一些问题。我仍然不断收到:

Spatial types and functions are not available for this provider because the assembly 'Microsoft.SqlServer.Types' version 10 or higher could not be found.

无论我在哪里,他们都在谈论 运行ning:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

global.asax 中的类似内容。我需要在 class 库中 运行 处理我的应用程序的数据层,因此没有启动事件。

我输入了

[assembly: PreApplicationStartMethod(typeof(Test.Startup), "Start")]
namespace Test
{
    public class Startup
    {
        public static void Start()
        { 
             SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
        }
    }
}

但这并没有起到任何作用。还有其他想法吗?

谢谢

克里斯

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

让我们首先澄清一些事情。此错误是由于缺少管理 Sql 服务器空间类型的程序集造成的。您可以通过以下任一方式解决此问题:

  • 正在计算机上安装 SQL 服务器
  • 依赖于 NuGet 包。

通常情况下,使用 NuGet 包更容易,所以我将对此进行解释。

版本NuGet package that you get depends on the version of Sql Server that you have running. My version of Sql Server is 11.0.6020.0, so I installed the 11.0.2 version of the NuGet package。这非常重要以匹配版本。

您需要 三个 个程序集。

  1. Microsoft.SqlServer.Types.dll
  2. msvcr<Version>.dll
  3. SqlServerSpatial<Version>.dll

Microsoft.SqlServer.Types.dll 是一个 managed 程序集,而另外两个是 native 程序集。

如果您安装了 正确版本 的 NuGet 包,那么所有这些都应该为您处理。

安装 NuGet 包后,它会打开一个自述文件,它给出了如何使用 Loader class.

加载本机程序集的示例

代码示例:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

最后,您需要覆盖 SqlProviderServices 静态 class 中的 SqlServerTypesAssemblyName 属性。 注意 这仅在更高版本的 EntityFramework 中可用。我正在使用 EntityFramework 6.1.3。在我的研究中,其他人说这在早期版本中不可用。

我再次使用版本 11.0.2 来匹配我的 Sql 服务器版本 ,所以我使用了以下代码:

SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

如果您使用的是较新版本的 Sql 服务器,您应该能够将 11 替换为 1213 或 [=25] =] 没有问题。

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

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