EF 6 是否支持 SQL Server 2014 类型?

Does EF 6 support SQL Server 2014 Types?

我有一个 asp.net mvc 5 web api 应用程序,我需要将 SqlGeography 实例转换为 DbGeography 实例以使用 Entity Framework 进行查询6. 我正在使用以下代码来执行此操作:

SqlGeography geo = SqlGeography.STGeomFromText(chars, Constants.SRID);
DbGeography dbGeo = DbSpatialServices.Default.GeographyFromProviderValue(geo);

GeographyFromProviderValue 的调用抛出以下异常:

The specified provider value is not compatible with this spatial services implementation. A value is required of type 'Microsoft.SqlServer.Types.SqlGeography, Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'.
Parameter name: providerValue

果然,我的 SqlGeography 实例来自 SQL Server 2014 类型程序集 (Microsoft.SqlServer.Types, Version 12.0.0.0)。

深入研究 Entity Framework 源代码表明此方法是罪魁祸首:

//EntityFramework.SqlServer.dll(6.0.0.0) System.Data.Entity.SqlServer.SqlTypesAssemblyLoader
public SqlTypesAssemblyLoader(IEnumerable<string> assemblyNames = null)
{   
    this._preferredSqlTypesAssemblies = (assemblyNames ?? ((IEnumerable<string>)new string[]
    {
        "Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91",
        "Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
    }));
        this._latestVersion = new Lazy<SqlTypesAssembly>(new Func<SqlTypesAssembly>(this.BindToLatest), true);
    }
}

如您所见,不包括 SQL Server 2014 的类型程序集。这是否意味着 Entity Framework 6 不支持来自 SQL Server 2014 的类型?

显然我可以找到 SQL Server 2012 的类型程序集并使用它,但我宁愿不必这样做。有没有其他办法解决这个问题?

您可以通过 SqlProviderServices.SqlServerTypesAssemblyName 静态 属性 设置 SQL 服务器类型程序集。 因此,将以下启动代码放入:

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