Свободное соединение ссылок NHibernate с игнорированием каскадного правила

Я использую Fluent NHibernate, пытаясь улучшить тестируемость и ремонтопригодность веб-приложения, использующего устаревшую базу данных, и у меня возникли проблемы с правильным отображением этой структуры:

У меня есть две таблицы, которые на самом деле представляют один объект в домене, поэтому я использую объединение для их сопоставления как такового, а третья таблица представляет второй объект.

Таблицы БД:

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

Это отлично работает для моих Gets, но когда я изменяю Account.ReportType.Number, а затем SaveOrUpdate() Account, я получаю сообщение об ошибке: «идентификатор экземпляра DataTest.Model.ReportType был изменен с (old_value) на (new_value)». .

Все, что я хочу сделать, это изменить ссылку учетной записи на ReportType, и я подумал, что, установив свойство Cascade.None() для ссылки на ReportType, NHibernate также не будет пытаться сохранить экземпляр ReportType, но я, должно быть, неправильно понимаю, как это работает. Я пробовал сделать ReportType ReadOnly(), сделать ссылку на ReportType ReadOnly() и т. д., и ничего не помогает.

Любые идеи?


person smathson    schedule 14.10.2010    source источник


Ответы (1)


Наконец решил эту проблему. Оказывается, я не думал об этом в духе NHibernate. На мой взгляд, у меня был новый ReportType.Number, поэтому мне нужно было его обновить. На самом деле мне нужно было получить ReportType с новым ReportType.Number и установить Account.ReportType. Выполнение этого способа сработало, как и ожидалось.

person smathson    schedule 19.10.2010