使用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
}
}
这种感觉就像一个组件,但是没有为这种类型的场景创建组件。有没有人对我如何映射这个有任何指示?
答案 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扩展方法中消失,使整个事情变得混乱。