使用一对多(子类)时确保一对一(不同)关系

时间:2013-08-12 12:29:20

标签: nhibernate inheritance fluent-nhibernate

我的方案是我有一个User类,该类必须使用相关数据进行扩展,但不进行子类化。

例如,用户可能包含许多不同的个人资料数据:AddressProfileDataFavoritesProfileData等。

我决定使用抽象类和许多实现,有点像这篇文章:inheritance mapping

但是,我找不到一种方法来确保(使用nhibernate而不是以编程方式)每个项目,例如AddressProfileData每个用户只出现一次。

这可能吗?如果没有,是否有另一个解决这个问题的方法更合适?我觉得共享一个共同的抽象类是围绕NHibernate构建我的应用程序,而不是反过来。

1 个答案:

答案 0 :(得分:0)

AddressProfileDataFavoritesProfileData可能几乎没有任何共同点,除非它们都是您附加到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用它做任何事情。您总是知道您正在触摸的是哪种类型的个人资料数据。