2009-07-20 7 views

Respuesta

9

Dos opciones.

  • si la base de datos es 100% responsable de esto sólo tiene que decirle a NHibernate que la propiedad se genera y no incluirlo en cualquier actualizaciones/isnerts. La desventaja es que NH necesitará hacer una selección adicional para mantener el valor actualizado en la memoria.

    < property name = "Foo" generada = "siempre" update = inserción "falsa" = "false" />

  • si la base de datos no se hace responsable y lo que desea que esto se haga de forma automática se puede utilice un interceptor para establecer el valor en 1 en una inserción e incrementarlo en 1 en una actualización.

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - interceptores)

Se podría anular OnSave() para encontrar la propiedad y establecer el valor inicial y luego anular OnFlushDirty() para encontrar la propiedad inmueble y el incremento.


Editar:

yo soy un idiota, no se dio cuenta que habías dicho Fluido NHibernate.


Edición # 2:

creo que también puede estar interesado en el uso de esta columna como un control de versiones?

< version name="Foo" generated="always" /> 
+1

No se preocupe, es casi lo mismo. Mapa (x => x.Foo) .ReadOnly().SetAttribute ("generado", "siempre"); El SetAttribute será reemplazado por Generated.Siempre cuando lleguemos a 1.0. –

+0

Descargué la última FNH y me confundí con .Update() que no tomaba un parámetro. No estaba seguro de qué terminaría eso en el mapeo. ReadOnly() tiene sentido. – anonymous

5

Esto funciona para mí:

public class Potato 
{ 
    public virtual Guid Id { get; protected set; } 
    public virtual int LegacyId { get; protected set; } 
} 

public class PotatoMap : ClassMap<Potato> 
{ 
    public PotatoMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert(); 
    } 
} 

Básicamente, el entero está dispuesto a ser generado por la base de datos y NHibernate es instruido para recuperarlo en los insertos.

Es importante tener en cuenta que la asignación es solo la mitad de la respuesta, y no funcionará si la columna no se crea como IDENTIDAD. CustomSqlType se agrega a la asignación con el fin de crear el sql adecuado al generar las tablas con SchemaExport. Este es el SQL generado:

create table [Potato] (
     Id UNIQUEIDENTIFIER not null, 
     LegacyId INT IDENTITY(1,1) not null, 
     primary key (Id) 
    ) 

Por otro lado, de sólo lectura y Generated.Insert() le dirá NHibernate que el valor se genera automáticamente por la base de datos sólo en las inserciones, y por lo tanto tiene que consultar la base de datos para el valor en cada inserción.

Tenga en cuenta que solo probé esto con el servidor Sql. El tipo personalizado probablemente cambie o no esté disponible en otras bases de datos.

Cuestiones relacionadas