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。这样做是按预期工作的。