Свободный NHibernate Объединенные ссылки, игнорируя правило каскад - PullRequest
0 голосов
/ 14 октября 2010

Я использую 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 () и т. Д., И, похоже, ничего не помогло.

Есть идеи?

1 Ответ

0 голосов
/ 19 октября 2010

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

...