2009-07-20 13 views

risposta

9

Due opzioni.

  • se il database è responsabile al 100% per questo è sufficiente per dire NHibernate che la proprietà è generato e non includere in tutti gli aggiornamenti/isnerts. Il rovescio della medaglia è che NH avrà bisogno di fare una selezione aggiuntiva per mantenere il valore fresco in memoria.

    < property name = "Foo" generato = "always" update = inserto "false" = "false" />

  • se il database non è responsabile e si vogliono solo avere automaticamente fatto è possibile utilizzare un intercettore per impostare il valore su 1 su un inserto e incrementarlo di 1 su un aggiornamento.

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

Si potrebbe sovrascrivere OnSave() per trovare la proprietà e impostare il valore iniziale e poi ignorare OnFlushDirty() per trovare la proprietà immobiliare e di incremento.


Edit:

Sono un idiota, non si accorse che hai detto Fluent NHibernate.


Edit # 2:

penso che si potrebbe anche essere interessati a utilizzare questa colonna come delle versioni?

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

Non preoccuparti, è quasi la stessa cosa. Mappa (x => x.Foo) .ReadOnly().SetAttribute ("generated", "always"); Il SetAttribute verrà sostituito da Generated.Always quando si preme 1.0. –

+0

Ho scaricato l'ultimo FNH ed è stato un po 'confuso da .Update() non prendendo un parametro. Non ero sicuro di cosa sarebbe finito come nella mappatura. ReadOnly() ha senso comunque. – anonymous

5

Questo funziona per me:

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(); 
    } 
} 

In sostanza, il numero intero è impostato per essere generato dal database e NHibernate è incaricato di recuperarlo su inserti.

È importante notare che la mappatura è solo metà della risposta, e sarà non funzionare se la colonna non viene creata come IDENTITÀ. CustomSqlType viene aggiunto al mapping con lo scopo di creare il corretto SQL quando si generano le tabelle con SchemaExport. Questa è la SQL generato:

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

Dall'altro lato, ReadOnly e Generated.Insert() dirà NHibernate che il valore viene generato automaticamente dal database solo su inserti, e quindi ha per interrogare il database per la valore ad ogni inserto.

Si noti che l'ho provato solo con Sql Server. Il tipo personalizzato probabilmente cambierà o potrebbe non essere disponibile in altri database.

Problemi correlati