¿Es posible tener una propiedad entera de un auto incremento de clase administrado por la base de datos pero no ser una clave primaria (o Id como NHibernate se refiere a ellos)? Tengo problemas para encontrar ejemplos de cómo hacer esto. Cualquier ayuda sería apreciada. Gracias.fluente nhibernate auto incremento propiedad no clave (Id)
Respuesta
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" />
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.
- 1. nhibernate no ahorrar Id clave externa
- 2. SqlCeParameter volver Auto ID (clave principal)
- 3. Hibernate Auto Increment ID
- 4. Django: haciendo un auto-incremento PK personalizado?
- 5. C# Class Incremento automático ID
- 6. fluente nhibernate r1.0 fluidez mapeo deshabilitar carga diferida
- 7. INSERT INTO que la columna no identidad ID de clave copia filas y auto-incrementos
- 8. Fluidez NHibernate - mapeo de una clave foránea como propiedad
- 9. Incremento Generador de NHibernate - No se pudo obtener valor inicial
- 10. NHibernate evict por id
- 11. NHibernate FlushMode Auto no se sonroja antes de encontrar
- 12. Cómo obtener el valor de la clave primaria de auto-incremento en MySQL usando Hibernate
- 13. NHibernate fórmula propiedad de filtro
- 14. Combinación fluida de NHibernate no usando la clave principal
- 15. No se puede establecer el auto-incremento a través de SQL Server Express Management Studio?
- 16. Identidad de clave no primaria Correlación de AutoIncrement con Fluidez NHibernate
- 17. ¿Por qué persiste JPA() no genera ID principal de incremento automático?
- 18. Asignación de NHibernate sin Id.
- 19. APP primaria de auto clave generar
- 20. Oracle - Insertar nueva fila con Auto Incremental ID
- 21. Compuesto Tecla/Id con NHibernate
- 22. subconsulta Auto-incremento en tsql instrucción de selección
- 23. NHibernate mapeo uno a muchos no en clave primaria
- 24. La propiedad 'Id' es parte de la información clave del objeto y no puede modificarse
- 25. atributo DefaultValue no funciona con mi propiedad Auto
- 26. ID de orden de la API de Magento frente al ID de incremento
- 27. LINQ a SQL inserto con clave primaria como tinyint se pone en auto-incremento da mensaje de error
- 28. LINQ to NHibernate y let palabra clave
- 29. El incremento automático de ID de mysql no comienza desde 0
- 30. Fluido NHibernate genera AND AND Assigned ID Columns
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. –
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