如何使用NHibernate / FluentNHibernate将三个表中的行映射到一个实体?

时间:2011-02-04 18:24:10

标签: nhibernate join fluent-nhibernate

我已经解开了这个特殊的问题,因为我对NHibernate / FluentNHibernate还很新鲜。我将详细描述这个问题,但在此之前,我想提一下,我可以随意更改域模型我认为合适的基础数据库。但是我对我目前的设计有特定的理由,如果可以的话我想坚持下去。

我有一个用户实体。用户有一些偏好,例如他们选择的文化(“en-US”/“fr-CA”等)和他们喜欢的转换系统(Metric / British Imperial等)。还有其他偏好,并且随着时间的推移可以(并且将)添加进一步的偏好。因此,我不希望将首选项表示为基础User表上的列。相反,我希望表结构看起来像这样(伪SQL):

Table Preference (int Id, nvarchar(50) Description)
Table PreferenceOption (bigint Id, int PreferenceId, nvarchar(50) Value)
Table UserPreferences (int Id, uniqueidentifier UserId, bigint PreferenceOptionId)

一个偏好(即“文化”)可以具有多个偏好选项(即“en-GB”,“fr-CA”)。用户的首选项保存在UserPreferences表中,该表具有PreferenceOption表的外键。

我希望我的域模型看起来像这样:

public class User
{
  public virtual Guid {get;set;}
  public virtual Preferences {get;set;}
}

public class Preferences
{
  public virtual CultureInfo Culture{get;}
  public virtual ConversionType ConversionType {get;}
}

我想我会尝试将属于用户的所有首选项加载到一个集合中(在Preferences类上),并让属性分别转换为CultureInfo和ConverstionType(自定义枚举)。

我真的很感激任何指示。

1 个答案:

答案 0 :(得分:1)

我不认为NHibernate能够处理这种情况下的所有角落案例。如果您对Id表中CultureInfo的{​​{1}}没有偏好,会发生什么?如果PreferenceOption根本不存在怎么办?如何将Preference映射到CultureInfo表中的特定行? (PreferenceOption是否真的是一个描述要填充哪个属性的常量?)

我觉得你在找麻烦。如果你想使用这样的模式,我想你可以更好地将你的模式映射到你的NHibernate POCO。您可以编写一些代码,以便从与您的用户相关的Description表的行中轻松填充Preferences对象。

坦率地说,如果您已经知道会有一些用户首选项,请将它们添加到您的架构中。在许多情况下(思考报告等 - 至少少一次加入和更多确定性)处理比基本上无类型的动态数据的“倾销场”表更容易。

如果您认为自己需要它,我会在紧急情况下离开倾倒场。但是,如果您可以灵活地在开发的这一点上包含您在架构中需要知道的数据,那么请执行此操作。