2009-05-05 19 views
8

Estoy tratando de crear una asignación a una tabla de base de datos que no tiene claves/referencias principales.Mapeo de tabla de Fluiber-NHibernate sin clave principal

public class TestMap : ClassMap<<Test>Test> { 

    public TestMap() { 

     WithTable("TestTable"); 

     Map(x => x.TestColumn); 

    } 

} 

Esto falla y espera identificación o identificación compuesta. ¿Es esto posible en nhibernate fluido?

+0

¿Hay una clave primaria 'no marcada'? Es decir, ¿alguna colección de campos crea una clave principal, pero la tabla no tiene una clave primaria definida? –

Respuesta

2

No. Tendrá que agregar una clave primaria sustituta, como una columna de identidad en SQL Server, para asignar esta tabla. Hasta donde yo sé, NHibernate no admite esto.

¿Por qué no tiene una clave principal en esta tabla?

+5

También me gustaría obtener una respuesta a esta pregunta. Algunas veces (la mayor parte del tiempo) no estamos trabajando en escenarios greenfield. En su lugar, establecemos un nuevo DAL de NHibernate con fluidez sobre un esquema db existente que no se puede modificar. Tengo una tabla sin una columna de identidad y claves bien definidas. Créame, si pudiera cambiar este esquema, lo haríamos, pero tenemos el requisito de no cambiar el esquema de la base de datos. –

4

En Oracle al menos, he usado "ROWID" para esto. Para mssql, puede utilizar la función incorporada "ROW_NUMBER()" para acceder de forma sencilla a la tabla, pero no lo he intentado ...

+0

¡Qué pequeño truco glorioso! Solo intenté asignar una columna de ID a ROWID y NHibernate no parece tener ningún problema. ¡GRACIAS! – rie819

0

Esta función no es admitida por nhibernate hasta donde yo sé. Como regla general, sin embargo, siempre debe tener algún tipo de identificación y si se encuentra en una situación en la que cree que no la necesita, debe evaluar su modelo de datos. Debe existir una ID, ya sea una clave primaria específica de la tabla o una clave sustituta de otra tabla. Esto no solo garantiza que nhibernate pueda procesar la tabla, sino que también ayuda al rendimiento a través de la indexación.

Antes de comenzar a asumir que nhibernate no va a satisfacer sus necesidades, considere por qué no tiene una llave en la mesa y qué tipo de sentido tiene no tenerla.

0

Si podemos llevar a una columna de la tabla que no tiene coulmn clave primaria/identidad, entonces podemos utilizar fluidez de la siguiente manera:

Id(x => x.TempID).Column("TempID"); 
0

Si la tabla contiene datos que pertenecen a otra entidad, se podría mapear como una colección de componentes. Los componentes no se identifican por sí mismos, pero pertenecen a otra entidad, que es identificado.

0

Puede asignar una entidad a una tabla sin claves definidas en la base de datos. Lo hago en las bases de datos heredadas de SQL Server. Sin embargo, la tabla debe tener una clave candidata (un conjunto de columnas que en realidad almacena una combinación única de valores). El concepto de entidad implica la noción de algún tipo de identidad . En lugar de esto, lo que intenta en su código es mapear una entidad sin identidad, lo que no es posible.

Cuestiones relacionadas