E 'possibile avere una proprietà intera di un incremento automatico di classe gestito dal database ma non essere una chiave primaria (o Id come NHibernate si riferisce ad essi)? Sto avendo difficoltà a trovare esempi su come farlo. Qualsiasi aiuto sarebbe apprezzato. Grazie.fluente nibernetico auto incrementa proprietà non chiave (Id)
risposta
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" />
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.
- 1. nibernetico fluente one-to-one?
- 2. NHibernate fluente - mappatura di una chiave esterna come proprietà
- 3. Incrementa il campo ID autoincremento di uno
- 4. fluente nibernato non supportato eccezione newexpression
- 5. Hibernate Auto Increment ID
- 6. C# Class Auto incremento ID
- 7. Proprietà incremento automatico non chiave
- 8. NHibernate fluente "Impossibile risolvere la proprietà"
- 9. Esterno interno o destro Unire in Nibernato e Fluente Nibernetico su molti a molti collezione
- 10. proprietà eredità: la sintesi proprietà Auto non sintetizzerà proprietà
- 11. NHibernate fluente - HasMany su chiave composita
- 12. mancante: dopo ID proprietà
- 13. learning nibernate (con o senza fluente)
- 14. JPA: Override Auto generato ID
- 15. Mappatura di proprietà privata con fluente nibernato
- 16. EF6 CodeFirst La mia colonna [chiave] Id non si incrementa automaticamente come una colonna di identità deve
- 17. Rails id auto-assegnazione che esiste già
- 18. NHibernate che emette dichiarazioni di aggiornamento estranee a prescindere dalle corrette impostazioni Inverse (fluente nibernetico) sulle relazioni
- 19. fluente nibernato HasOne WithForeignKey non funziona
- 20. Miscelazione di un'interfaccia fluente e non fluente in una classe
- 21. Mappatura tabella Fluent-NHibernate senza chiave primaria
- 22. SQL Server incrementa automaticamente una colonna senza chiave primaria
- 23. Fluente NHibernate genera colonne aggiuntive
- 24. NHibernate fluente - Come mappare una chiave esterna non nullable che esiste in due tabelle collegate
- 25. Fluente NHibernato Mappa a campo privato/protetto che non ha esposizione Proprietà
- 26. NHibernate fluente HasMany mapping insert NULL Chiave esterna
- 27. Il contatore non incrementa in PHP/MySQL
- 28. Mappatura fluente EF core alle proprietà dell'oggetto interno
- 29. attributo DefaultValue non funziona con la mia proprietà Auto
- 30. Come mappare una proprietà senza setter e nessuna proprietà di supporto fluente con NHibernate?
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. –
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