Quel est le moyen correct de mapper une colonne TIMESTAMP dans une base de données SQL Server 2008 à l'aide de nouveaux mappages basés sur le code de NHibernate?
J'ai la propriété de ma classe définie comme octet [] et j'utilise le mappage suivant dans Mon fichier de classe de classe: p> Cependant, NHibernate s'attend à un entier basé sur ce mappage (jette une exception sur les insertions). Si je spécifie explicitement le type de mappage en tant que byte [], je reçois une exception indiquant: "System.argumentoutofrangeException: type attendu Mise en œuvre IUSERVERVERINTTYPE
Nom du paramètre: persistancetype ". P> Quel est le moyen approprié de mapper une colonne d'horodatage automatique avec les nouveaux mappages à base de code NHibernate? P> --- Modifier P> Je pense que je pense que j'ai rétréci, j'ai besoin de définir le type sur la cartographie sur BinaireType (un type de NHibernate qui implémente IversionType), mais Binarytype n'a pas de constructeur public ... Je pense que je suis à l'abri des idées. p> p>
3 Réponses :
Nous utilisons également Voici des mappages: p> aussi pour plus de détails s'il vous plaît voir Ce lien p> p> Byte [] Version {Obtenir; } code> pour la mise en œuvre de la version.
Merci pour la réponse, malheureusement, je n'utilise pas couramment NHibernate. J'utilise simplement les mappages de codes intégrés qui sont nouveaux dans 3.2 Les mappages de code intégrés n'ont pas de douane
Si vous attrapez le code source Nib, il existe une classe dans un projet de test qui vous aidera avec ce dont vous avez besoin: Nhibernate.Test.Vorsiontest.db.msql.binaireTimeMestamp. Fondamentalement, vous devez lui donner un type personnalisé qu'il peut utiliser pour convertir la valeur. Soyez par défaut NIHHHIB attend que la valeur soit une INT (Regardez SECIiont 5.1.7 de NIBL DOCS ). Si vous utilisez une colonne INT / BIGINT comme colonne de version, vous n'aurez pas besoin d'un type personnalisé.
La classe personnalisée (soulevée du code source NIB): P>
public class Car { public virtual long CarId { get; set; } public virtual string Name { get; set; } public virtual byte[] LastModified { get; set; } public override string ToString() { return string.Format("Id: {0}, Name: {1}, Last Modified: {2}", CarId, Name, LastModified); } } public class CarMap : ClassMapping<Car> { public CarMap() { Table("Cars"); Id(car => car.CarId, mapper => mapper.Generator(Generators.Identity)); Property(car => car.Name); Version(car => car.LastModified, mapper => { mapper.Generated(VersionGeneration.Always); mapper.Type<BinaryTimestamp>(); }); } }
Dans le cas d'une conventionModelMapper, j'ai fini par utiliser les suivants ..
ConventionModelMapper mapper = new ConventionModelMapper(); //...other mappings mapper.Class<Entity>(map => map.Version(e => e.Revision, m => { m.Generated(VersionGeneration.Always); m.UnsavedValue(null); m.Type(new BinaryBlobType()); m.Column(c => { c.SqlType("timestamp"); c.NotNullable(false); }); }));