【问题标题】:NHibernate: Overriding automapping on a one to many relationshipNHibernate:覆盖一对多关系上的自动映射
【发布时间】:2013-04-08 08:13:24
【问题描述】:

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

类用户:您的标准用户类

类偏好:一组键值对。一个用户可以有很多偏好。

Class Post:为简洁起见省略了完整的描述,但用户创建了一个帖子,它可以包含一个或多个偏好。

所以,回顾一下:

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 接口的类,但我不确定如何进行实际映射。

谢谢,
光辉

【问题讨论】:

  • Post 表中的 Preference_Id 有什么用?你说一个帖子有很多偏好。 Post.Preferences 是否也包含与 User.Preferences 相同的元素?
  • 是的.. Post.Preferences 始终包含来自 User.Preferences 的数据。

标签: fluent-nhibernate automapping


【解决方案1】:

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

我还注意到您的偏好表和发布表中都有一些复合键,我会研究如何映射复合键。这是一个链接,可以帮助您映射复合键(具有多列的主键):
Using Fluent NHibernate to map Composite Keys

就您的流畅映射而言,以下内容可能会让您指向正确的方向,您可以使用 HasManyReferences 映射 one-to-many 关系,具体取决于您希望外键在哪个表上:

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); 
    }
}

【讨论】:

    【解决方案2】:

    由于偏好相同,一个简单的属性就足够了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多