2012-03-09 16 views
6

Me gustaría que NHibernate genere guiones para entidades solo si el usuario o la aplicación no los configuran manualmente. Básicamente, al guardar objetos con el nuevo Guid() (todos ceros), NHibernate debe generar uno. Al guardar un objeto que tiene un Guid distinto de cero, debería usarlo en su lugar.NHibernate Guid generador si es nuevo

¿Mi única opción es escribir mi propio generador?

editar Gente, soy consciente de 'asignado'. Debería haber especificado que estaba enterado. Como no hace lo que quiero que haga, no es la opción que estoy buscando. Escribir mi propio generador es una opción que funciona, pero me gustaría algo más. Sospecho que no hay nada más.

Respuesta

1

¿Ha intentado establecer el atributo unsaved-value?

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"> 
    <generator class="guid.comb" /> 
</id> 

edición Ahora entiendo su pregunta totalmente otra opción en vez de desarrollar su propio generador es utilizar

<generator class="assigned" /> 

Sin embargo no se puede utilizar SaveOrUpdate(). En su lugar, debe especificar explícitamente NHibernate si el objeto se debe guardar o actualizar llamando al método Save() o Update() de la ISession. Además, siempre deberá establecer el GUID de forma manual en todas sus NUEVAS entidades. Es una opción.

+0

No, no tengo. No creo que funcione, ya que consideraría un valor no 0 como guardado. Lo que podría no ser. Como quiero crear un Guid yo mismo. Voy a establecer valores que no sean 0 en Id. – wasabi

+0

Ah, eso es diferente entonces, tu pregunta no estaba clara. – Rippo

+0

Gosh. Pensé que expuse eso con bastante claridad. – wasabi

2

El problema aquí es que NH necesita saber si el objeto es nuevo o si ya existe. Lo hace generalmente estableciendo la ID.

Si escribió su propio generador, no resuelve el problema, ya que solo se invoca si el objeto es nuevo.

  • Puede usar el generador assigned.
  • Puede utilizar una columna de versión para indicar si el objeto es nuevo. Nunca lo intenté de esta manera, pero debería funcionar. NO tener ninguna indicación de NH si el objeto es nuevo causa bastantes problemas. Créame.
  • También podría tener un número entero como clave principal y el GUID como un campo único regular.

I whould generar el id de la clase constructor

class Entity 
{ 
    Guid id; 

    Entity(Guid id = Guid.Empty) 
    { 
    if (id == Guid.Empty) this.id = Guid.NewGuid(); 
    else this.id = id; 
    } 
} 
+0

No sigo. El objeto ES nuevo. Solo quiero permitir que mi código de usuario establezca manualmente el valor Id, antes de llamar a Guardar. Al igual que 'asignado', excepto que también debe funcionar si Id == Guid.Zero – wasabi

+0

Si desea asignar la ID en el código de usuario, debe utilizar "asignado". Si desea crear una identificación cuando el código de usuario no la asigne, solo haga esto en el constructor del objeto. Es tan simple como eso. –

+0

Stefan, lo sería, excepto que quiero hacer ambas cosas. – wasabi