Comment faire la carte d'une colonne VARCHAR(MAX) dans NHibernate hbm.xml fichiers de mappage
Nous avons une table SQL Server avec varchar et nvarchar max colonnes comme ceci:
CREATE TABLE [dbo].[MyTable](
:
[MyBigUnicodeColumn] [nvarchar](max) NULL,
[MyBigAnsiColumn] [varchar](max) NULL,
:
Lors de la création de la cartographie (hbm.xml) des fichiers, la la documentation dit d'utiliser StringClob comme l'attribut type pour de gros objets, avec un type de base de données de DbType.La chaîne, mais cela ne veut pas dire que faire si le type de base de données est DbType.AnsiString.
<class name="MyTable" table="MyTable" lazy="false">
:
<property name="MyBigUnicodeColumn" type="StringClob" />
<property name="MyBigAnsiColumn" type="????" />
:
C'est pour NHibernate 3.3.1.
OriginalL'auteur Phil Haselden | 2012-08-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mapper comme
string
ouAnsiString
.Lorsque la longueur est de plus de 4000 ou 8000 respectivement, NH crée un type nvarchar(max) ou varchar(max).
J'ai peut-être que la longueur est utilisée pour les paramètres sql et qu'il est tronqué à la longueur spécifiée (cela dépend de l'hôtel NH la version que vous utilisez, il ya eu quelques changements). Afin de mieux spécifier assez grand.
Modifier: Malheureusement, il ne fonctionne pas avec le AnsiString le même comme avec les autres chaînes. J'ai lu certains NH code et constaté ce qui suit:
varchar(max) est pris en charge par le dialecte à partir de SQL Server 2005.
MsSql2000Dialect.cs, ligne 205
MsSql2005Dialect.cs, ligne 19:
Il enregistre varchar(max), comme le type sql de choisir le moment où un AnsiString est mappé de plus de 8000.
Dans le SqlClientDriver.cs, vous pouvez voir qu'elle met en œuvre des "blobs" dans les paramètres de chaînes, mais pas pour les chaînes ansi (ligne 135):
Il met toujours 8000 comme la limite de la paramètre de type AnsiString.
En raison de l'incompatibilité entre le conducteur et le dialecte, je dirais que c'est un bug.
Parce que le bug se produit sur tous les AnsiStrings, il ne permet pas de spécifier le sql de type dans la cartographie (NH est en mesure de choisir le bon type sql). Vous avez besoin d'utiliser la solution de contournement proposée dans le fil de discussion a commencé sur le NH forum:
Je l'ai signalé comme un bug: https://nhibernate.jira.com/browse/NH-3252
De l'autre côté, tout cela est mis en œuvre dans le Dialecte, et il est assez facile d'avoir votre propre dialecte.
Cela dépend du NH version que vous utilisez. Ils spécifier la longueur lors du passage de paramètres, afin de rendre SQL Server réutiliser les requêtes. Le client de SQL Server utilisée pour couper les données, ce qui était très mauvaise, de sorte que la vérification de la longueur. Si vous souhaitez utiliser le trou de 2 GO max longueur, spécifiez comme ça ...
Bonjour Stefan, Dans des tests un peu plus de NH 3.3.1 je ne pense pas que le type VARCHAR. Si je spécifie la longueur de 1000000 de la colonne de type varchar, ne sera toujours pas recevoir plus de 8000 caractères OOTB. Un bref coup d'oeil au code source (le SqlClientDriver.SetDefaultParameterSize méthode) semble de retour. Pour info j'ai posté à la nhusers groupe pour voir si je peux obtenir quelques éclaircissements.
Note: j'ai marqué ceci comme la réponse, mais ne l'ai pas testé moi-même. En fin de compte j'ai changé les colonnes varchar(max) type de données nvarchar(max) pour éviter le problème.
OriginalL'auteur Stefan Steinegger
De l'utilisateur Nexus sur le NHibernate (nhusers) forum dit:
Note: je n'ai pas vérifié ce que j'ai décidé de convertir toutes les colonnes VARCHAR(MAX) type de données NVARCHAR(MAX) à la place.
OriginalL'auteur Phil Haselden
Et hibernate.cfg.xml fichier:
OriginalL'auteur ADM-IT