我的方案是我有一个User
类,该类必须使用相关数据进行扩展,但不进行子类化。
例如,用户可能包含许多不同的个人资料数据:AddressProfileData
,FavoritesProfileData
等。
我决定使用抽象类和许多实现,有点像这篇文章:inheritance mapping
但是,我找不到一种方法来确保(使用nhibernate而不是以编程方式)每个项目,例如AddressProfileData
每个用户只出现一次。
这可能吗?如果没有,是否有另一个解决这个问题的方法更合适?我觉得共享一个共同的抽象类是围绕NHibernate构建我的应用程序,而不是反过来。
答案 0 :(得分:0)
AddressProfileData
和FavoritesProfileData
可能几乎没有任何共同点,除非它们都是您附加到User
的额外信息,所以我认为它不会使它们成为某种继承层次结构的一部分。相反,我会用这样的东西:
public class User
{
// ... other properties ...
public virtual AddressProfileData Address { get; set; }
public virtual FavoritesProfileData Favorites { get; set; }
}
public class AddressProfileData
{
// ... other properties ...
public virtual User User { get; set; }
}
<class name="User">
<!-- ... other properties ... -->
<one-to-one name="Address" property-ref="User" />
<one-to-one name="Favorites" property-ref="User" />
</class>
<class name="AddressProfileData">
<!-- ... other properties ... -->
<many-to-one name="User" column="User_id" unique="true" not-null="true" />
</class>
create table AddressProfileData (
/* ... other columns ... */
User_id int not null,
unique (User_id),
foreign key (User_id) references User (Id)
);
我相信你可以想象FavoritesProfileData
的样子。
通过这种设置,您可以确保每种类型的配置文件数据仅在每个用户中出现一次,并且您也不会在一个奇怪的地方结束,您必须先测试您正在处理哪种类型的ProfileData用它做任何事情。您总是知道您正在触摸的是哪种类型的个人资料数据。