6
votes

NHibernate 3.2 par code Classmapping pour la propriété Propriété

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: xxx

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 ".

Quel est le moyen approprié de mapper une colonne d'horodatage automatique avec les nouveaux mappages à base de code NHibernate?

--- Modifier

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.


0 commentaires

3 Réponses :


5
votes

Nous utilisons également Byte [] Version {Obtenir; } pour la mise en œuvre de la version.

Voici des mappages: xxx

aussi pour plus de détails s'il vous plaît voir Ce lien


1 commentaires

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



6
votes

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


0 commentaires

3
votes

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


0 commentaires