2012-03-13 12 views
5

Estoy trabajando con la base de datos brownfield que utiliza cadenas como claves principales. Usando Fluido NHibernate con Sqlite (proveedor de memoria para pruebas unitarias) y SQL Server 2005.Cómo usar las teclas de cadena en (fluido) NHibernate

tengo la siguiente entidad:

public class Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 

    public virtual string Name { get; set; } 
} 

Con este mapeo:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Map(_ => _.TimeStamp); 
     Id(_ => _.Name).CustomType("AnsiString"); 
    } 
} 

Sin embargo, esto no funciona diciendo NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

Cómo hacer este trabajo? Además, ¿hay alguna buena documentación disponible sobre nhibernate fluido?

Gracias de antemano.

+0

Thx para los enlaces, aunque no son nuevos para mí, ni contienen todo lo relacionado con mi pregunta :) yo no era capaz de encontrar nada acerca de las claves de cuerda ahí. También me gustaría comenzar con un mapeo explícito. –

+0

Esto se discute en este enlace http://stackoverflow.com/questions/411825/nhibernate-with-string-primary-key-and-relationships –

+0

@krystanhonour no exactamente. También esa pregunta no tiene respuesta aceptada. Si puede reconocer la respuesta, ¿podría volver a publicarla aquí y obtener votos y mi agradecimiento? Gracias. –

Respuesta

12

Si está utilizando cuerdas como sus claves primarias es probable que tenga que hacer algo como esto:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.Name).GeneratedBy.Assigned(); 
     Map(x => x.TimeStamp); 
    } 
} 

De la documentación nhibernate:

5.1.4.7. Identificadores asignados

Si desea que la aplicación asigne identificadores (a diferencia de que NHibernate los ha generado), puede usar el generador asignado. Este generador especial utilizará el valor de identificador ya asignado en la propiedad del identificador del objeto. Tenga mucho cuidado al usar esta función para asignar claves con significado comercial (casi siempre una terrible decisión de diseño ).

Debido a su naturaleza inherente, las entidades que usan este generador no pueden ser guardadas a través del método SaveOrUpdate() de la ISession. En su lugar, tiene que especificar explícitamente a NHibernate si el objeto se debe guardar o actualizado llamando al método Save() o Update() del ISession.

También aquí hay un artículo relacionado. Es un poco anticuado, pero todavía se aplica a su situación:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8

Cuestiones relacionadas