我有一个以下数据库方案设置,我无法真正改变。
User
----
Id (primary key)
[Some simple properties...]
UserAdditionalData
------------------
Id (primary key)
[Some simple properties...]
USERID (foreign key to User)
很明显,User
表确实没有任何记忆,无论它是否与UserAdditionalData
记录相关联,所以我认为我不能称之为真正的记录。 - 这里的映射,因为它们也不共享互斥的PK。
但是,在实践中,我希望能够处理User
对象,例如检查它是否有UserAdditionalData
记录,如果有,请访问其属性。
我已经设置了我的BDO:
public class User
{
[Some simple properties...]
public virtual UserAdditionalData UserAdditionalData { get; set; }
}
public class UserAdditionalData
{
[Some simple properties...]
public virtual User User { get; set; } /* I have this here,
but I don't really ever
have to access it in this
direction */
}
我已经设置了我的映射:
public UserMapping()
{
Table("USER");
[Some simple properties...]
HasOne(x => x.UserAdditionalData).Cascade.None();
}
public UserExtraMapping()
{
Table("USER_ADDITIONAL_DATA");
[Some simple properties...]
References(x => x.User, "USERID").Unique();
}
这都是编译,但我看到我的UserExtra对象(通过User对象访问时)始终为null。 我已经尝试了很多不同的方法来解决它,阅读很多关于实现这个作为一对多。但是,我仍然无法让它发挥作用。
非常感谢任何帮助。
谢谢!
[小更新]:我只需要查询数据库,如果与任何方式相关,则不保存。
答案 0 :(得分:1)
根据您的 小更新 ,我会使用简化的映射。我们将从NHibernate实际映射功能中获益,并优化用户负载。所有这些因为我们确实需要只读映射。
首先,我们应该在附加类
上引入简单的int
属性UserId
// extra class is having an int property containig the foreign key
public class UserAdditionalData
{
public virtual int UserId { get; set; }
}
// that would be the mapping:
public UserExtraMapping()
{
...
Map(x => x.UserId, "USERID");
}
现在,我们将使用优化的映射来延迟加载many-to-one
(即与一对一的比较,它总是加载两端,这里我们只有在真正需要的时候才能获得参考数据! )
public UserMapping()
{
...
References(x => x.UserAdditionalData)
.LazyLoad()
.PropertyRef(e => e.UserId)
.Not.Insert()
.Not.Update()
;
}
因此,对于readonly,我会尽力使用many-to-one
映射(References()
)
另见: