2012-03-14 78 views
1

我將Fluent NHibernate和自動映射功能一起使用。現在我看着像配置,設置,自定義屬性 - 無論 - 聲明一個實體屬性爲「ReadOnlyFromDb」屬性應該是隻讀的db字段(流暢的NHibernate自動映射)

在MsSql數據庫即時通訊使用計算列在我的表中的一個計算值在特定數據行的某些其他值上。現在我已經在實體類中聲明此列爲

public virtual int STATUS { get; private set; } 

獲取表格的特定數據一切正常。該屬性STATUS填充正確與數據表中的具體值。

當我嘗試SaveUpdate()特定對象時發生此問題。 我總是異常

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

這是我的理解正確的 - 和它如何應該是)!

基本上即時尋找一個配置,設置,自定義屬性 - 無論 - 說

嘿功能NHibernate - 得到特定屬性propertyName但不插入/更新屬性propertyName

有沒有這樣的事情?或者是否存在這種情況的解決方法? 我已經搜索了流利的nhibernate wiki,但沒有找到一個smilliar案例。

我希望有人已經面對和解決了這個問題!

這裏是代碼片段我如何創建會話(也許它可以幫助):

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(); 
    } 
} 
相關問題