2017-04-10 92 views
2

我有几个问题试图获得代码优先的实体框架6.0与Microsoft.SQLServer.Types建立迁移。我仍然继续获得:类库,实体框架代码第一和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); 
     } 
    } 
} 

但是,这并没有任何效果。任何人有任何其他想法?

感谢

克里斯

回答

5

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

让我们从澄清几件事开始。这个错误是由于缺少一个程序集来管理Sql Server Spatial类型而导致的。您可以通过解决此问题:

  • 机器
  • 取了NuGet包的依赖上安装SQL Server。

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

你得到的NuGet package的版本取决于你运行的Sql Server的版本。我的Sql Server版本是11.0.6020.0,所以我安装了11.0.2版本的NuGet package。这是超级重要以匹配版本。

还有三个组件,您将需要。

  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); 

最后,你需要重写的SqlProviderServices静态类的SqlServerTypesAssemblyName属性。 注意,这只适用于更高版本的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的新版本,你应该能够用121314代替11,没有问题。

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

  • 确保Microsoft.SqlServer.Types.dll引用。
  • 确保将本地组件复制到..\SqlServerTypes\<Platform>\文件夹下的bin目录中。应该有两个
  • 确保您正在调用LoadNativeAssemblies并在之前设置SqlServerTypesAssemblyName之前的任何数据库操作,包括创建您的DbContext实例。
  • 如果您的DbContext是在执行程序集的独立程序集中,您可能需要以参考Microsoft.SqlServer.Types程序集。它可能不会通过构建/引用过程被复制。
+1

天才,工作就像一个魅力。谢谢克里斯 – ChrisB

相关问题