У меня есть следующая базовая модель домена для моих учетных записей на сайте MVC:
public class Account
{
public Account()
{
Details = new AccountDetails( this );
Logon = new LogonDetails(this);
}
public virtual int Id { get; private set; }
public virtual AccountDetails Details { get; set; }
public virtual LogonDetails Logon { get; set; }
...
}
public class AccountDetails
{
// Primary Key
public virtual Account Account { get; set; }
public virtual DateTime Created { get; set; }
...
}
public class LogonDetails
{
// Primary Key
public virtual Account Account { get; set; }
public virtual DateTime? LastLogon { get; set; }
...
}
И AccountDetails, и LogonDetails используют отображение, подобное этому:
public class AccountDetailsOverride : IAutoMappingOverride<AccountDetails>
{
public void Override( AutoMap<AccountDetails> mapping )
{
mapping
.UseCompositeId()
.WithKeyReference( x => x.Account, "AccountId" );
mapping.IgnoreProperty( x => x.Account );
}
}
Я разделил данные учетной записи и данные для входа в систему на отдельные модели, поскольку мне редко нужна эта информация, тогда как для многих операций и авторизации сайта мне нужны идентификатор пользователя и имя. Я хочу, чтобы свойства Details и Logon загружались только при необходимости. С моими текущими попытками картирования я могу получить одно из двух поведений:
# 1 Создать таблицу и загрузить успешно, не может сохранить
Используя это отображение:
public class AutoOverride : IAutoMappingOverride<Account>
{
public void Override( AutoMap<Account> mapping )
{
mapping.LazyLoad();
mapping
.References( x => x.Details )
.WithColumns( x => x.Account.Id )
.Cascade.All();
mapping
.References( x => x.Logon )
.WithColumns( x => x.Account.Id )
.Cascade.All();
}
}
Таблицы генерируются как ожидалось. Существующие данные правильно загружаются в модель, но я не могу сохранить. Вместо этого я получаю индекс вне диапазона исключений. Предположительно, потому что Account.Details и Account.Logon пытаются использовать одно и то же поле БД для справки (сам Account.Id).
# 2 Таблица содержит дополнительные поля, не сохраняет должным образом
Используя это отображение:
public class AutoOverride : IAutoMappingOverride<Account>
{
public void Override( AutoMap<Account> mapping )
{
mapping.LazyLoad();
mapping
.References( x => x.Details )
.Cascade.All();
mapping
.References( x => x.Logon )
.Cascade.All();
}
}
Я получаю таблицу с отдельным полем для Details_id и Logon_id, но они равны нулю, поскольку значение Details.Account.Id равно нулю, когда учетная запись сохраняется. Таким образом, попытка Session.Get учетной записи приводит к пустым деталям и входу в систему. Если я дважды сохраню учетную запись, таблица обновится правильно, и я смогу ее загрузить.
Помощь ... * * 1023
Должен быть способ отображения этой иерархии, и я упускаю что-то простое. Есть ли способ помочь nhibernate выбрать правильное поле (для решения # 1) или заставить его автоматически обновлять зависимые поля после сохранения (для решения # 2)?
Спасибо за любые идеи, которые вы, ребята, можете предоставить.