代码之家  ›  专栏  ›  技术社区  ›  Joseph Yaduvanshi

fluent nhibernate多对多映射,使用自动生成的pk而不是组合键

  •  0
  • Joseph Yaduvanshi  · 技术社区  · 15 年前

    我正在.net中开发一个roleprovider,使用fluent nhibernate映射oracle 9.2数据库中的表。

    问题是连接用户和角色的多对多表使用从序列生成的主键,而不是组合键。我不能真的改变这个,因为我写它是为了在一个更大的现有系统中实现。

    这是我的用户地图:

            public UserMap()
            {
                this.Table("USR");
                HasMany(x => x.Memberships).Cascade.All()
                    .Table("MEMBERSHIP").Inverse().LazyLoad();
                HasManyToMany(x => x.Roles)
                    .Table("USR_ROLE")
                    .Cascade.SaveUpdate()
                    .ParentKeyColumn("USR_ID")
                    .ChildKeyColumn("ROLE_ID")
                    .Not.LazyLoad();
            }
    

    我的角色:

        public RoleMap()
        {
            this.Table("ROLE");            
            Map(x => x.Description).Column("ROLE_NAME");
            Map(x => x.Comment).Column("ROLE_COMMENT");
            HasManyToMany(x => x.Users)
                .Table("USR_ROLE")
                .ParentKeyColumn("ROLE_ID")
                .ChildKeyColumn("USR_ID")
                .Inverse();
        }
    

    然而,这给了我一个错误:

    程序集“fluentnhibernate,version=1.0.0.593,culture=neutral,publickeytoken=8aa435e3cb308880”中的类型“fluentnhibernate.cfg.fluentconfigurationexception”未标记为可序列化。

    是否有一个简单的修复程序允许此hasmaytomany使用我的persistentobjectmap扩展?我想我可能需要为这种多对多的关系添加一个约定,但是我不知道从哪里开始,因为我最近才开始使用nhibernate和fluent nhibernate。

    我已经研究这个问题一段时间了,似乎找不到解决办法。 任何帮助都将不胜感激。谢谢。

    编辑: 我想我找到了一个可能的解决办法: http://marekblotny.blogspot.com/2009/02/fluent-nhbernate-and-collections.html

    我将尝试上面的方法为链接表创建一个实体和一个类图,并发布我的发现。

    编辑2: 我创建了一个链接实体,如上面的博客文章所述,并下载了最新的二进制文件(1.0.0.623)。
    这有助于我发现问题在于设置延迟加载和尝试在一个全新的会话中向用户对象添加角色。

    我修改了代码以将opensession移动到httpmodule的beginrequest,如前所述 here . 完成此操作后,我将数据访问代码从在using语句中包装打开的会话(在会话完成时关闭会话)更改为获取当前会话并仅在using语句中包装事务。

    这似乎解决了我的大部分问题,但我现在得到一个错误,说“无法插入集合”到usr_角色表。我想知道上面的代码是否适用于描述如下的用户角色映射:

        public UserRoleMap()
        {
            this.Table("USR_ROLE"); 
    
            /* maps audit fields id, created date/user, updated date/user */
            this.PersistentObjectMap("USR_ROLE"); 
    
            /* Link these tables */
            References(x => x.Role).Column("ROLE_ID");
            References(x => x.User).Column("USR_ID");
        }
    

    hibernate的多对多关系文档建议创建一个对象来维护一对多/多对一,如在erd中。我相信使用传统的命名标准会容易得多,但是我必须坚持使用某些缩写和奇怪的(并不总是正确实现的)约定。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Joseph Yaduvanshi    15 年前

    为了解决这个问题,我为userrole创建了一个实体、映射和存储库。而且,与用户和角色实体中的hasmanytomany映射不同,我有一个hasmany映射。有点奇怪,因为我现在有:

    IList<UserRole> UserRoles {get; protected set;}

    IList<Role> Roles { get{ return UserRoles.Select(u => u.Role).ToList(); } }

    不过,我不能百分之百地确定为什么这样做,而草率的人却不行。