将实体列表捆绑到组件中

时间:2011-02-04 20:02:08

标签: nhibernate list fluent-nhibernate

使用FluentNHibernate,我已经映射了一个引用GeneralPreference,GeneralPreferenceOption和Profile实体的UserPreference实体:

public class UserPreference
{
    public virtual long Id { get; set; }
    public virtual Profile Profile { get; set; }
    public virtual GeneralPreference Preference { get; set; }
    public virtual GeneralPreferenceOption Value { get; set; }
}

在我的Profile实体上映射UserPreference列表很容易,但我真正想要做的是将此列表包装在另一个类中,以便我可以简化有关用户给定首选项的操作:

public class Preferences
{
  public IList<UserPreferences> UserPreferences{get;set;}

  public Language Language {
  {
    //look up the language preference here
  }
}

这种感觉就像一个组件,但是没有为这种类型的场景创建组件。有没有人对我如何映射这个有任何指示?

1 个答案:

答案 0 :(得分:0)

通过在我的个人资料实体上映射私有财产,我找到了一种方法。使用Fluent NHibernate wiki中的技术映射私有属性(http://wiki.fluentnhibernate.org/Fluent_mapping_private_properties),我在我的Profile实体上映射了UserPreference的集合。然后我创建另一个类PropertyHandler,它将IEnumerable作为构造函数参数,并在Profile上创建一个公共属性的实例:

public class Profile
{
  private PreferenceHandler _preferenceHandler;

  get { return _preferenceHandler ?? (_preferenceHandler = new PreferenceHandler(UserPreferences)); }

  private IEnumerable<UserPreference> UserPreferences { get; set; }

  public static class Expressions
  {
    public static readonly Expression<Func<Profile, IEnumerable<UserPreference>>> UserPreferences = x => x.UserPreferences;
  }

}

注意嵌套的静态类。它用于启用私有属性与FluentNHibernate的映射。

映射类看起来像这样:

public class ProfileMappings : ClassMap<Profile>
{
  public ProfileMappings()
  {
    //... other mappings
    HasMany(Profile.Expressions.UserPreferences);
  }
}

我现在可以使用PreferenceHandler类在我的UserPreference集合上创建帮助器方法。

另一种方法是为IEnumberable构建扩展方法。这有效,但我决定不这样做,因为

1)我并没有真正扩展IEnumerable功能和

2)我的帮助方法在所有其他IEnumerable扩展方法中消失,使整个事情变得混乱。