0

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

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

我决定使用抽象类和许多实现,有点像这篇文章:继承映射

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

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

4

1 回答 1

0

AddressProfileData并且FavoritesProfileData可能几乎没有共享任何共同点,除了它们都是附加到 a 的额外信息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 类型,然后才能执行任何操作它。您始终确切地知道您所接触的个人资料数据类型。

于 2013-08-16T04:05:45.163 回答