6

Ho un asp.net mvc un'applicazione API 5 web in cui ho bisogno di convertire un'istanza SqlGeography in un'istanza DbGeography per l'interrogazione con Entity Framework 6. Sto utilizzando il seguente codice per farlo:EF 6 supporta i tipi di SQL Server 2014?

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

La chiamata a GeographyFromProviderValue genera la seguente eccezione:

Il valore del provider specificato non è compatibile con questa implementazione di servizi spaziali. È richiesto un valore di tipo 'Microsoft.SqlServer.Types.SqlGeography, Microsoft.SqlServer.Types, Version = 11.0.0.0, Culture = neutral, PublicKeyToken = 89845dcd8080cc91'.
nome parametro: providerValue

Abbastanza sicuro, il mio esempio SqlGeography è venuta dal SQL Server 2014 tipi di montaggio (Microsoft.SqlServer.Types, Version 12.0.0.0).

Scavando nel codice sorgente Entity Framework mostra questo metodo per essere il colpevole:

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

Come si può vedere, l'assemblea tipi per SQL Server 2014 non è incluso. Ciò significa che Entity Framework 6 non supporta i tipi da SQL Server 2014?

Ovviamente è possibile trovare l'assembly Tipi per SQL Server 2012 e utilizzarlo, ma preferirei non farlo. C'è un altro modo per aggirare questo problema?

risposta

3

È possibile impostare l'assemblaggio dei tipi di SQL Server tramite la proprietà statica SqlProviderServices.SqlServerTypesAssemblyName. Quindi, inserire il codice di avvio come segue:

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

Ha funzionato benissimo. Grazie! – Mansfield