NHibernate:覆盖一对多关系的自动化

时间:2013-04-16 03:34:34

标签: fluent-nhibernate automapping

我刚刚开始使用Fluent NHibernate,并希望得到一些关于如何映射这个的帮助/指针。这是我正在使用的域模型:

班级用户:您的标准用户班次

类首选项:一组键值对。用户可以有许多偏好。

课程帖子:为了简洁起见省略了完整的说明,但用户创建了一个帖子,它可以包含一个或多个首选项。

所以,回顾一下:

class User 
{
    IList<Preference> Preferences;
    IList<Post> Posts;
} 

class Post
{
    IList<Preference> PostData;
}

Hibernate automapper提供了以下数据库结构:

User
------------------------
User_Id

Preference
------------------------
Preference_Id | User_Id | Post_Id

Post
------------------------
Post_Id | User_Id

偏好表对我来说看起来很难看,而且更像是:

User
------------------------
User_Id

Preference
------------------------
Preference_Id | User_Id

Post
------------------------
Post_Id | User_Id | Preference_Id

非常感谢有关如何做到这一点的任何帮助!我已经有一个实现IAutoMappingOverride接口的类,但我不确定如何进行实际的映射。

谢谢,
Teja公司

2 个答案:

答案 0 :(得分:1)

我会参考此配置来正确配置手动和自动映射:
Mixing Mixing Automapping and manual mapping

我还注意到你的首选项和帖子表中都有一些复合键我会学习如何映射复合键。这是一个链接,可以帮助您映射复合键(主键具有多个列):
Using Fluent NHibernate to map Composite Keys

就您的流畅地图而言,以下内容可能会指向正确的方向,您可以使用one-to-manyHasMany来映射References关系,具体取决于您希望外国人使用哪个表格关键是:

public class UserMap : ClassMap<User>
{
    public UserMap(){
        Id(x => x.Id).Column("User_Id").GeneratedBy.Identity();
        HasMany(x => x.Preferences);
    }
}
public class PostMap: ClassMap<Post>
{
    public UserMap(){
        Id(x => x.Id).Column("Post_Id").GeneratedBy.Identity();
        References(x => x.Preferences); 
    }
}

答案 1 :(得分:0)

因为首选项相同,所以简单属性就足够了

class Post
{
    public virtual User User { get; set; }
    public virtual IList<Preference> Preferences { get { return User.Preferences; } }
}