2012-03-14 10 views
1

Fluent NHibernateとautomapping機能を併用しています。ここでは、設定、設定、カスタム属性のようなものを探しています - 何でも - "ReadOnlyFromDb"としてエンティティプロパティを宣言する読み取り専用のDBフィールド(Fluent NHibernate Automapping)であるべきプロパティ

MsSqlデータベースでは、値が計算されるmyテーブルの計算カラムを使用しています特定のデータ行の他の値で今、私はすべてが正常に動作テーブルの具体的なデータを取得するには

public virtual int STATUS { get; private set; } 

などのエンティティクラスでこのコラムを宣言しました。プロパティSTATUSは、データテーブル内の特定の値で正しく入力されます。

特定のオブジェクトSaveUpdate()を試してみると問題が発生します。 私はいつも私の理解のために正しいことを例外

A computed column cannot be the target of an INSERT or UPDATE statement 

を取得 - と、それがすることになりましたか;)!

基本的には、コンフィギュレーションを探して、カスタム属性を設定するIM - 何が - と言って

ちょっと流暢NHibernateは - 特定のプロパティpropertyNameを取得するが、更新/プロパティを挿入しないpropertyName

そんなことはありますか?または、この場合の回避策はありますか? 私は流暢なnhibernate wikiを検索しましたが、賢明な事例は見つかりませんでした。

誰かが既にこの問題に直面して解決してくれることを願っています!ここで

は、私がセッションを作成する方法のコードスニペットです(多分それは役立ちます):

public static ISessionFactory GetNHibernateSession() 
    { 
     if (nhibernateSession != null) 
      return nhibernateSession; 

     if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty) 
      throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString)); 

     //nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString])) 
     //        .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory(); 

     nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString])) 
            .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly()) 
            .Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647)) 
            .IgnoreBase(typeof(BaseClass)) 
            .IgnoreBase(typeof(IDColumn)) 
            .IgnoreBase(typeof(MsSqlQuery)) 
            .IgnoreBase(typeof(MsSqlParamCollection)) 
            .IgnoreBase(typeof(AbweichungStatus)) 
            )).BuildSessionFactory(); 
     return nhibernateSession; 
    } 
} 

おかげで今のところ応答のために - これまでのところ、私を助けました。 しかし、これをよりダイナミックに解決する方法はありますか?例えば

:ちょうどこの値を読んで、それを挿入/更新しない:私は、カスタム属性を宣言したい

[ReadOnlyDbField]が今言って、このcusomt属性を持つエンティティのすべてのプロパティを宣言すると呼ばれます。

基本的に私はこれを実装する方法はあります設定

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update() 

に言いたいですか?

答えて

5
.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update()) 

更新:編集した質問のアカウント

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField> 
{ 
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance) 
    { 
     instance.Not.Insert(); 
     instance.Not.Update(); 
    } 
} 
関連する問題