2010-10-06 6 views
0

Je cours NHibernate et SQL Server CE J'essaie d'utiliser des GUID comme colonne d'identification. Voici le code que je l'ai déjà:Utilisation de GUID avec SQL Server et NHibernate

Cartographie:

<class name="DatabaseType" table="DBMON_DATABASE_TYPE"> 
    <id name="Id" column="DATABASE_TYPE_ID"> 
     <generator class="guid" /> 
    </id> 
    <property name="DispName" /> 
    </class> 

Et c'est la create crée:

create table DBMON_DATABASE_TYPE (
    DATABASE_TYPE_ID BIGINT not null, 
    DispName NVARCHAR(255) null, 
    primary key (DATABASE_TYPE_ID) 
) 

Et c'est le genre d'instruction d'insertion que je veux être en mesure à courir sur elle:

Insert into DBMON_DATABASE_TYPE (DATABASE_TYPE_ID,DISPNAME) values ('f5c7181e-e117-4a98-bc06-733638a3a264','DOC') 

Et c'est l'erreur que je reçois quand je tente que:

Major Error 0x80040E14, Minor Error 26306 
> Insert into DBMON_DATABASE_TYPE (DATABASE_TYPE_ID,DISPNAME) values ('f5c7181e-e117-4a98-bc06-733638a3a264','DOC') 
Data conversion failed. [ OLE DB status value (if known) = 2 ] 

Encore une fois mon objectif est d'être en mesure d'utiliser GUIDs comme la colonne d'identification de ma table, ils ne doivent même pas être généré automatiquement, je peux les générer manuellement dans les méthodes Save/saveOrUpdate de NHibernate . S'il y a d'autres informations que vous devez savoir s'il vous plaît faites le moi savoir!

Répondre

1

Dans votre cartographie, vous devez identifier que vous voulez que NHibernate cr Avoir un GUID dans le schéma de base de données (il semble que vous générez votre schéma à partir du mappage nhibernate). En haut de ma tête ce qui suit devrait fonctionner:

<id name="Id" column="DATABASE_TYPE_ID" type="Guid"> 
    <generator class="guid" /> 
</id> 
1

au lieu de

DATABASE_TYPE_ID BIGINT not null, 

il doit être

DATABASE_TYPE_ID UNIQUEIDENTIFIER not null, 

Je ne saurais trop vous conseiller d'utiliser NEWSEQUENTIALID() par défaut à la place puisque vous utilisez comme un index ordonné en clusters, car il ne sera pas cause la division des pages et donc la fragmentation, voir ici comment l'utiliser http://msdn.microsoft.com/en-us/library/ms189786.aspx

+1

Utilisez Guid.Comb si vous générez des ID côté client. Utilisez NewSequentialID si la base de données génère les ID. –

+0

Les unités en peigne ne fonctionnent bien que lorsqu'une seule instance du client est en cours d'exécution. Vous pouvez également affecter GUid.NewGuid du côté client lorsque vous devez exécuter plusieurs zones. – Paco

1

Oserais-je recommander GuidComb à la place?

Questions connexes