【发布时间】:2010-08-19 09:27:34
【问题描述】:
我的 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 );
}
}
我已将帐户详细信息和登录详细信息拆分为单独的模型,因为我很少需要这些信息,而我需要用户 ID 和名称来进行许多站点操作和授权。我希望仅在需要时才延迟加载 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 都试图使用相同的 db 字段作为参考(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 帐户会导致 Details 和 Logon 为空。如果我保存帐户两次,表格会正确更新,我可以加载它。
帮助...
必须有一种映射这种层次结构的方法,我缺少一些简单的东西。有没有办法帮助 nhibernate 选择正确的字段(解决#1)或让它在保存后自动更新依赖字段(解决#2)?
感谢大家提供的任何见解。
【问题讨论】:
标签: c# nhibernate