2009-07-14 6 views
5

Betrachten Sie die folgende einfache C# Klasse:Wie kann NHibernate den Datenbankstandardwert beim Speichern einer neuen Entität verwenden?

public class Entity 
{ 
    public Entity() { } 
    public virtual int Id { get; private set; } 
    public virtual DateTime DateCreated { get; private set; } 
} 

mit der folgenden einfachen Zuordnung NHibernate Mapped:

<class name="Entity" mutable="false"> 
    <id name="Id"> 
     <generator class="native"> 
    </id> 
    <property name="DateCreated"/> 
</class> 

Zum folgende einfachen Datenbankschema:

CREATE TABLE Entity (
    Id int IDENTITY(1,1) PRIMARY KEY, 
    DateCreated datetime NOT NULL DEFAULT getUtcDate() 
) 

Wenn Sie eine neue Instanz erstellen der Entity und Speichern in der Datenbank, wie Sie NHibernate anweisen, den Standardwert der Datenbank für die verwenden DateCreated Spalte, wenn der Wert null ist? Alternativ, wie kann ich angeben, dass NHibernate das Ergebnis der getUtcDate() Funktion als Wert für das Feld DateCreated beim Einfügen verwenden soll?

Während ich leicht

DateCreated = DateTime.Now; 

in den Konstruktor Entity hinzufügen könnte, dies des Anwendungsservers lokale Uhr wird automatisch mit, und ich brauche die Datenbank der lokale Uhr zu verwenden, die Konsistenz zu gewährleisten, wenn es mehrere Anwendungsserver jeweils mit ihre möglicherweise nicht synchronisierten lokalen Uhren.

+0

kann nicht nhibernate Frage beantworten, aber in der Regel werden Sie Daten in Ihrer Datenbank als UTC gespeichert werden sollen. Unabhängig von ihrer Quelle ist UTC auf allen Servern gleich (vorausgesetzt, die Uhren sind genau). –

+0

Im Allgemeinen ja, zugestimmt. Deshalb habe ich getUtcDate() anstelle von getDate() in der Frage angegeben. :) – iammichael

Antwort

4

können Sie angeben, dass die Eigenschaft von der Datenbank generiert wird:

NHibernate Mapping - property

Also für Ihren Fall, dass Sie angeben wollen würde:

generated="insert" 

Auf diese Weise NHibernate weiß nach einer INSERT es muss die Entity aktualisieren, aber nach Updates wird DateCreated nicht geändert.

Möglicherweise müssen Sie auch angeben:

update="false" insert="false" 

Ich habe noch nie verwendet erzeugt wird, und ich bin nicht sicher, ob NHibernate diejenigen einstellen folgert oder Sie haben es explizit zu tun.

+0

Nicht sicher, wie ich das in den Dokumenten verpasst habe (http://nhforge.org/doc/nh/en/index.html#mapping-generated); Ich schwöre, ich habe mindestens zwei Mal geschaut und muss genau darauf gestarrt haben. – iammichael

+0

Ich mag Ihre Doc-Links besser. Ich muss anfangen, NH Forge regelmäßig zu stoppen. – anonymous

+0

Leider beantwortet dies die Frage nicht vollständig. Während es für Einfügungen funktioniert, müssen Sie für Updates Datenbankauslöser verwenden. NHibernate sendet immer noch nicht "DEFAULT" oder "GETUTCDATE()" als Teil des UDPATE. –

1

Ich hatte ein ähnliches Problem. Ich musste das Attribut dynamic-insert="true" meiner Klassenzuordnung hinzufügen.
Aus der Dokumentation:

dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null. 
Verwandte Themen