我有以下数据库结构(无法更改):
Users
- UserID (int)
- UserType (varchar)
- UserDetailsID (int)
Individual
- IndividualID (int)
...
Organisation
- OrganisationID (int)
...
Users表中的UserDetailsID列根据UserType列(“个人”,“组织”)中存储的值引用个人或组织。 绝对不是最好的数据库设计,但这是我们现在必须要合作的。
这是我们的映射类的开始:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("Users");
LazyLoad();
Id(x => x.UserID).GeneratedBy.Identity().Column("UserID");
}
}
我要做的是根据UserType列中的值将User实体中的UserDetailsID映射到正确的表/实体。 因此,如果UserType ==“individual”,它应映射到Individual;如果UserType ==“organization”,它应映射到Organization。 是否可以使用Fluent NHibernate进行此操作?那会怎么做?
答案 0 :(得分:0)
我自己想出了一个解决方案:
我的实体模型如下所示:
public class User
{
public User() { }
public virtual int UserID { get; set; }
public virtual string UserType { get; set; }
public virtual bool IsIndividual
{
get { return UserType == "Individual"; }
}
public virtual bool IsOrganisation
{
get { return UserType == "Organisation"; }
}
private Individual _individual;
public virtual Individual Individual
{
get { return (IsIndividual ? _individual : null); }
set { _individual = value; }
}
private Organisation _organisation;
public virtual Organisation Organisation
{
get { return (IsOrganisation ? _organisation : null); }
set { _organisation = value; }
}
}
然后我将UserDetailsID列映射两次,但使用延迟加载:
Map(x => x.UserType).Column("UserType");
References(x => x.Individual).Column("UserDetailsID").LazyLoad();
References(x => x.Organisation).Column("UserDetailsID").LazyLoad();
然后在实体中,它将在首先检查UserType后调用对Organization或Individual的适当引用。
这似乎对我有用,但如果有人有更好的解决方案,请添加你的答案。
答案 1 :(得分:0)
是的,我认为如果你喜欢它还有另外一种方法。关于FluentNhibernate的翻译不确定。
http://nhibernate.info/doc/nh/en/index.html#inheritance-tablepersubclass-discriminator
祝你好运