Join Fluent NHibernate忽略级联规则加入引用

Join Fluent NHibernate忽略级联规则加入引用,join,fluent-nhibernate,nhibernate-mapping,nhibernate-cascade,Join,Fluent Nhibernate,Nhibernate Mapping,Nhibernate Cascade,我正在使用Fluent NHibernate,试图提高使用遗留数据库的web应用程序的可测试性和可维护性,但在正确映射此结构时遇到了一些问题: 我有两个表,它们实际上代表域中的一个实体,因此我使用连接来映射它们,第三个表代表第二个实体 DB表: [eACCT] ACCT_ID ACCT_NAME [eREPORT_TYPE] ACCT_ID REPORT_NO [eREPORT_TYPE_DESC] REPORT_NO REPORT_TYPE

我正在使用Fluent NHibernate,试图提高使用遗留数据库的web应用程序的可测试性和可维护性,但在正确映射此结构时遇到了一些问题:

我有两个表,它们实际上代表域中的一个实体,因此我使用连接来映射它们,第三个表代表第二个实体

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");
    }
实体:

[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");
    }
映射:

[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");
    }
这对我的get很有效,但当我修改Account.ReportType.Number,然后修改SaveOrUpdate()Account时,我会得到错误:“DataTest.Model.ReportType实例的标识符已从(旧的_值)更改为(新的_值)”

我想做的就是修改Account对ReportType的引用,我认为通过在对ReportType的引用上设置Cascade.None()属性,NHibernate也不会试图保存ReportType实例,但我一定误解了它的工作原理。我尝试过使ReportType只读()、引用ReportType ReadOnly()等等,但似乎没有任何帮助


有什么想法吗?

终于解决了这个问题。事实证明,我并没有以一种非自由主义的方式来思考这个问题。在我看来,我有一个新的ReportType.Number,所以这就是我需要更新的。实际上,我需要做的是使用新的ReportType.Number获取ReportType并设置Account.ReportType。这样做的效果和预期的一样