.NET Core 3.1和SQL Server hierarchyid-多个例外



我在.Net Core 3.1项目中使用SQL Server Db,一些存储过程和视图具有参数和数据的hierarchyid类型。

我使用Microsoft.Data.SqlClient软件包。当我尝试用SqlDataReader读取数据时,我得到了异常:

System.IO.FileNotFoundException:无法加载文件或程序集"Microsoft.SqlServer.Types,Version=10.0.0,Culture=neutral,PublicKeyToken=88945dcd8080cc91"。系统找不到指定的文件。

好的,我试着按照建议使用Microsoft.SqlServer.Types,但这个包不是.NET标准,它不起作用。

此外,我找到了EntityFrameworkCore.SqlServer.HierarchyId,但当我使用它时,我得到了:

System.InvalidCastException:无法将"Microsoft.SqlServer.Types.SqlHierarchyId"类型的对象强制转换为"Microsoft.Data.SqlClient.Server.IBinarySerialize"类型.

那么,究竟如何在.NET Core 3.1中使用HierarchyId类型呢?

我计划在linux上托管这个解决方案。

更新

我确实使用了与.NET Core兼容的Microsoft.Data.SqlClient2.0。此外,我添加了EntityFrameworkCore.SqlServer.HierarchyId,得到了这个错误:

System.InvalidCastException:无法将"Microsoft.SqlServer.Types.SqlHierarchyId"类型的对象强制转换为"Microsoft.Data.SqlClient.Server.IBinarySerialize"类型.

这是.csproj:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EntityFrameworkCore.SqlServer.HierarchyId" Version="1.1.0" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="Helpers" />
</ItemGroup>
</Project>

到目前为止运气不好。

更新2

这是抛出异常的代码:

using (SqlDataReader reader = await detailsCmd.ExecuteReaderAsync())
{
while (reader.Read())
{
details.Add(new HierarchyDetails
{
Id = reader.GetInt32(0),
groupPath = reader.GetValue(1).ToString(), // <==== EXCEPTION
name = reader.GetString(2),
optionalData = reader.IsDBNull(3) ? null : reader.GetString(3)
});
}
}

表中只有一行:

id  groupPath   culture name    optionalData
24  0x58        en-US   testing 

您的错误消息建议您使用使用nuget的东西https://www.nuget.org/packages/Microsoft.SqlServer.Types/10.50.1600.1它是.NET Framework dll,而不是.NET Core。

您提到您使用Microsoft.Data.SqlClient,请确保您使用https://www.nuget.org/packages/Microsoft.Data.SqlClient/它与.NET Core兼容。

如果出现其他错误,请检查实体框架核心层次结构ID

目前在所有查询中将hierarchyid转换为NVARCHAR的解决方案:

... CAST(groupPath as NVARCHAR(4000)) as groupPath ...

然后将其用作字符串。

最新更新