运行单元测试遇Microsoft.SqlServer.Types版本缺失报错求助
我来帮你捋捋这个问题!你碰到的这个报错,是Entity Framework在处理空间类型的时候,找不到正确版本的Microsoft.SqlServer.Types程序集导致的——哪怕你重新装了包还没解决,大概率是程序集加载机制或者版本绑定的问题,给你几个靠谱的解决办法:
手动强制加载原生程序集
单元测试的运行环境和普通项目不一样,有时候不会自动加载SqlServer.Types依赖的原生库。你可以在测试类的初始化方法里加一段代码,强制加载正确的版本:[TestInitialize] // 如果你用的是NUnit,对应[SetUp] public void InitTest() { SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); }这段代码会帮你把对应版本的原生dll加载到测试环境里。
检查并添加版本绑定重定向
如果你的解决方案里有多个项目用到了不同版本的Microsoft.SqlServer.Types,可能会出现版本冲突。打开测试项目的app.config(或web.config),添加以下绑定重定向配置,把旧版本都指向你安装的最新版本:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>注意把
newVersion改成你实际安装的NuGet包版本号(比如13.0.0.0、14.0.0.0都可以)。确保测试项目也安装了对应NuGet包
很多人容易忽略这一点:只在主业务项目里装了Microsoft.SqlServer.Types,但测试项目没装。打开NuGet包管理器,给测试项目也安装相同版本的这个包,保证测试环境能找到对应的程序集。检查输出目录的依赖文件
运行测试后,去测试项目的bin/Debug(或Release)目录下看看,有没有一个名为SqlServerTypes的文件夹,里面应该包含x86和x64两个子文件夹,以及对应的原生dll(比如sqlserverspatial140.dll、msvcr120.dll)。如果没有,手动把主项目输出目录里的这个文件夹复制到测试项目的输出目录里试试。
另外补充一句:如果你的项目用的是EF Core,那空间类型的支持是通过Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite包,不过从你的报错信息来看,应该是EF6的场景,上面的方法都适用。
内容的提问来源于stack exchange,提问作者mightynifty

