2009-07-20 8 views

Antwort

9

Zwei Optionen.

  • , wenn die Datenbank 100% verantwortlich dafür ist, brauchen Sie nur NHibernate zu sagen, dass das Objekt erzeugt wird und nicht in irgendwelchen Updates/isnerts aufzunehmen. Der Nachteil ist, dass NH eine zusätzliche Auswahl treffen muss, um den Wert im Speicher frisch zu halten.

    < property name = "Foo" erzeugt = "always" update = "false" Insert = "false" />

  • , wenn die Datenbank nicht verantwortlich ist und Sie nur wollen, dies automatisch haben, können Sie Verwenden Sie einen Interceptor, um den Wert in einer Einfügung auf 1 zu setzen und bei einer Aktualisierung um 1 zu erhöhen.

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

Sie würden OnSave() überschreiben, die Immobilie zu finden und den Anfangswert gesetzt und dann außer Kraft setzen OnFlushDirty() die Eigenschaft Eigenschaft und Zuwachs zu finden.


Edit:

Ich bin ein Idiot, bemerkte es nicht gesagt, Sie Fluent NHibernate.


Edit # 2:

Ich glaube, Sie auch bei der Verwendung dieser Spalte als Versionierung interessiert sein könnte?

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

Keine Sorge, es ist fast das Gleiche. Karte (x => x.Foo) .ReadOnly().SetAttribute ("erzeugt", "immer"); Das SetAttribute wird von Generated.Always ersetzt, wenn wir 1.0 erreichen. –

+0

Ich habe das neueste FNH heruntergeladen und war irgendwie verwirrt von .Update() nahm keinen Parameter. Ich war mir nicht sicher, wie das enden würde. ReadOnly() macht jedoch Sinn. – anonymous

5

Dies funktioniert für mich:

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

Grundsätzlich ist die ganze Zahl wird durch die Datenbank und NHibernate generiert werden angewiesen, auf Einsätze abzurufen.

Es ist wichtig zu beachten, dass die Zuordnung nur die Hälfte der Antwort ist, und es wird nicht funktionieren, wenn die Spalte nicht als IDENTITY erstellt wird. CustomSqlType wird dem Mapping mit dem Zweck hinzugefügt, beim Generieren der Tabellen mit SchemaExport die richtige SQL zu erstellen. Dies ist das erzeugte SQL:

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

Auf der anderen Seite, nur lesbar und Generated.Insert() wird NHibernate sagen, dass der Wert durch die Datenbank auf Einsätze nur automatisch generiert wird, und deshalb hat es die Datenbank für die abfragen Wert bei jedem Einsatz.

Beachten Sie, dass ich dies nur mit Sql Server getestet habe. Der benutzerdefinierte Typ wird sich wahrscheinlich ändern oder in anderen Datenbanken möglicherweise nicht verfügbar sein.

Verwandte Themen