0

我使用功能NHibernate在試圖提高在Web應用程序的可測試性和可維護性正在使用舊的數據庫,我遇到了一些麻煩正確映射這種結構:功能NHibernate加入引用忽略級聯規則

我有兩個表格確實代表了域中的一個實體,所以我使用連接來映射它們,第三個表格代表第二個實體。

DB表:

[eACCT] 
    ACCT_ID 
    ACCT_NAME 

[eREPORT_TYPE] 
    ACCT_ID 
    REPORT_NO 

[eREPORT_TYPE_DESC] 
    REPORT_NO 
    REPORT_TYPE 

實體:

public class Account 
{ 
    public virtual string AccountID { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual ReportType ReportType { get; set; } 
} 

public class ReportType 
{ 
    public virtual int Number { get; set; } 
    public virtual string Type { get; set; } 
} 

映射:

public AccountMap() 
    { 
     Table("eACCT"); 
     Id(x => x.AccountID, "ACCT_ID"); 
     Map(x => x.AccountName, "ACCT_NAME"); 

     Join("eREPORT_TYPE", m => 
     { 
      m.KeyColumn("ACCT_ID"); 
      m.References(x => x.ReportType) 
       .Cascade.None() 
       .Column("REPORT_NO"); 
     }); 
    } 

    public ReportTypeMap() 
    { 
     Table("eREPORT_TYPE_DESC"); 
     Id(x => x.Number) 
      .Column("REPORT_NO") 
      .GeneratedBy.Assigned(); 
     Map(x => x.Type, "REPORT_TYPE"); 
    } 

這正常工作對我的獲取,B當我修改Account.ReportType.Number然後SaveOrUpdate()Account時,我得到錯誤:'DataTest.Model.ReportType實例的標識符已從(old_value)更改爲(new_value)'。

我想要做的就是修改Account對ReportType的引用,我認爲通過在引用ReportType上設置Cascade.None()屬性,NHibernate不會嘗試保存ReportType實例,但我必須誤解這是如何工作的。我試着做ReportType ReadOnly(),使對ReportType ReadOnly()等的引用,似乎沒有任何幫助。

任何想法?

回答

0

終於解決了這個問題。原來我並沒有用NHibernate的方式來考慮這個。在我看來,我有一個新的ReportType.Number,所以這就是我需要更新的。實際上,我需要做的是使用新的ReportType.Number獲取ReportType並設置Account.ReportType。這樣做是按預期工作的。