2015-03-20 1 views
2

Je tente de mapper une géométrie SqlServer2008 avec FluentNHibernate. J'utilise NHibernate version 4.0.0.4000. J'ai installé NHibernate.Spatial, NetTopologySuite, GeoAPI et NHibernate avec FluentNhibernate tout avec NUget.Mappage de la géométrie de SQLServer2008 vers .NET (NHibernate 4.0.0.4000)

Ma carte Fluent ressemble à ceci:

public class ArealMap: ClassMap<Areal> 
{ 
    public Areal() 
    { 
     Table("Areal"); 
     Id(x => x.Id).Column("Id").GeneratedBy.Identity(); 
     Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSql2008GeometryType)); 
    } 
} 
public class Areal 
{ 
    .... 
    public virtual Geometry Geometry{ get; set; } 
} 

Avec NHibernate 4.0.0.4000 Areal sera toujours mis en correspondance à null au lieu de la valeur dans la base de données (de la géométrie de type). Les propriétés non géométriques sont mappées correctement.

Cette mise en correspondance fonctionnait parfaitement dans NHibernate 3.3.3. J'ai aussi ajouté

.Dialect<MsSql2008GeometryDialect>()) 

à ma configuration couramment ....

Je pense que tous les DLLs ont la bonne version installée, que je les ai par NuGet. Je ne pense pas que c'est un problème NH/Fluent NH car tous mes autres mappings fonctionnent bien ...

Existe-t-il une nouvelle syntaxe pour mapper la géométrie du serveur SQL à NHibernate dans la version pour NH 4.0? Je ne pas savoir ce que je manque ..

EDIT:

Quand je change le mappage:

Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSqlLegacyGeometryType)); 

Je ne soyez nulle en géométrie plus, au lieu de mon polygone dans la base de données est écrit à un mappé comme une géométrie de point de type avec des coordonnées différentes ....

Je pense que ce problème peut être causé par différentes versions de Microsoft.SqlServer.Types étant utilisé ... SqlServer2008 utilise la version 10.0 et NHibernate .Spatial.MsSql utilise la version 11.0 ... Ou il peut y avoir des changements dans la rupture GeoAPI ou NetTopologySuite ...

EDIT:

D'accord, je trouve la source du problème ....

J'utilise SQL Server 2008, il utilise Microsoft.SqlServer.Types.dll dans

C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\10.0.0.0__89845dcd8080cc91\ 

Cependant, les dll NHibernate.Spatial qui travaillent avec NHibernate 4.0 attendent plus SQLServer et référence Microsoft.SqlServer.Types.dll la version 11 en

C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0_89845dcd8080cc91\ 

Quelqu'un sait-il comment résoudre ce problème?

Je pense que je dois à la caisse/clone l'un des projets NHibernate.Spatial et référence manuellement la version Microsoft.SqlServer.Types.dll 10 puis recompiler le projet ...

Je suis perdu cependant que l'endroit où début. De quels projets ai-je besoin pour reoompile? NetTopologySuite qui est référencé par NHibernate.Spatial ou seulement NHibernate.Spatial?

+0

Avez-vous par hasard comme cela sur le groupe de discussion nhusers? – Trinition

Répondre

2

Alors peut-être pas idéal car il est de vous forcer à utiliser une ancienne version, j'ai pu résoudre un décalage impliquant la géométrie DLLS après une NHibernate mise à niveau à l'aide d'une redirection de liaison sur la déclaration d'assemblage dans le 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-11.0.0.0" newVersion="10.0.0.0" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 
+0

nous avons ajusté notre code comme ça et ça marche! Ce n'est en effet pas idéal, mais je ne pense pas qu'il existe vraiment un autre moyen que d'ajuster la version de MS SQLServer ... Une autre façon serait de compiler toutes les DLLs dépendantes avec l'ancienne version de Microsoft.SqlServer.Types mais ceci serait très complexe et rendrait les mises à jour encore plus difficiles ... – Philipp