2009-07-20 6 views

答えて

9

2つのオプション。

  • データベースは、あなただけのプロパティが生成され、すべての更新/ isnertsでそれを含まないことをNHibernateはを伝える必要があり、このために100%責任がある場合。欠点は、ナショナルセミコンダクターが価値を新鮮に保つために追加選択を行う必要があることです。 =「常に」更新=「false」を挿入生成

    <プロパティ名=「foo」という=「偽」/>

  • データベースが責任を負うものではなく、あなただけの、これは自動的にあなたができる行っているしたい場合インターセプタを使用して、挿入時に値を1に設定し、更新時に値を1増加させます。

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors(11.1 - インターセプタ)

あなたは、プロパティを見つけて、初期値を設定し、プロパティプロパティおよび増分を見つけるために、OnFlushDirty()を上書きするのOnSave()をオーバーライドします。


編集:

私は馬鹿だ、あなたは流暢NHibernateのは言っ気づきませんでした。


編集#2:

私はあなたにもバージョン管理として、この列を使用することに興味があるかもしれないと思いますか?

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

ほとんど同じですので心配しないでください。 Map(x => x.Foo).ReadOnly()。SetAttribute( "generated"、 "always"); SetAttributeはGenerated.Always 1.0になったときに置き換えられます。 –

+0

最新のFNHをダウンロードしましたが、パラメータを取らない.Update()によって混乱させられました。私はそれがマッピングのように終わるのかどうかはわかりませんでした。 ReadOnly()は意味があります。 – anonymous

5

これは私の作品:

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

は基本的に、整数は、データベースによって生成されるように設定されており、NHibernateのは、インサート上で、それを取得するように指示されます。

マッピングが回答の半分に過ぎず、列がIDENTITYとして作成されない場合はではなく、が機能することに注意することが重要です。 CustomSqlTypeが、SchemaExportでテーブルを生成するときに適切なsqlを作成する目的で、マッピングに追加されます。これは、生成されたSQLである:他の側

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

、読み取り専用およびGenerated.Insert()値のみインサート上のデータベースによって自動生成されていることをNHibernateのを教え、従ってそれのためにデータベースを照会する必要がありますすべてのインサートで値。

私はSql Serverでこれをテストしました。カスタムタイプはおそらく変更されるか、他のデータベースでは使用できないことがあります。

関連する問題