需要帮助w / NFLuent Hibernate映射

时间:2010-01-17 05:10:35

标签: .net nhibernate fluent-nhibernate mapping

我尽可能地寻找解决方案,但似乎我在某处感到茫然。这是我第一次进入Fluent NHibernate& NHibernate的。

短版本(仍然很长)是我有一个包含表User,Role,UserRoles的数据库。 b / t它们之间的关系应该相当直观......可以为用户分配多个角色。 UserRoles表存储这些关联,因此User&角色不直接链接。我想我需要一个多对多的关系,但我不知道如何在NFLuent中映射它。

我已经在NFLuent入门页面上完成了示例并让它正常工作。我试图从中推测出答案,但我错过了某些地方。

我会列出我的实体&在一秒钟内映射,但我得到的错误是:

  

创建SessionFactory时使用了无效或不完整的配置。检查PotentialReasons集合,以及InnerException以获取更多详细信息。

潜在的原因集合除了InnerException之外没有说什么:

  

{“无法确定类型:DataAccess.Entities.User,DataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null,对于列:NHibernate.Mapping.Column(User)”}

hbm文件 这是我的实体:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess.Entities
{
public class User
    {
        public virtual int Id { get; private set; }
        public virtual string DisplayName { get; set; }
        public virtual string Email { get; set; }
        public virtual string Password { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess.Entities
{
    public class Role
    {
        public virtual int Id { get; private set; }
        public virtual string RoleName { get; set; }
        public virtual string RoleDescription { get; set; }  
    }
}   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess.Entities
{
    public class UserRole 
    {
         public virtual int Id { get; private set; } 
         public virtual Role Role { get; set; }
         public virtual User User { get; set; }

         //Attempted variations
         //public virtual IList<Role> Roles{ get; set; }
         //public virtual IList<User> Users { get; set; }

         //public UserRole()
         //{
         //    Roles = new List<Role>();
         //    Users = new List<User>();
         //}

         //public virtual void AddRole(Role role)
         //{
         //    Roles.Add(role);
         //}

         //public virtual void AddUser(User user)
         //{
         //    Users.Add(user);
         //}
    }
}

以下是我的映射:

using DataAccess.Entities;
using FluentNHibernate.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess.Mappings
{
    public class RoleMap : ClassMap<Role>
    {
        public RoleMap()
        {
            Id(x => x.Id);
            Map(x => x.RoleDescription);
            Map(x => x.RoleName);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess.Entities;
using FluentNHibernate.Mapping;

namespace DataAccess.Mappings
{
    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Id(x => x.Id);
            Map(x => x.DisplayName);
            Map(x => x.Email);
            Map(x => x.Password);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess.Entities;
using FluentNHibernate.Mapping;

namespace DataAccess.Mappings
{
    public class UserRoleMap : ClassMap<UserRole>
    {
        public UserRoleMap()
        {
            Id(x => x.Id);
            Map(x => x.User);
            Map(x => x.Role);            
            //HasMany(x => x.Users)
            //  .Inverse()
            //  .Cascade.All();
            //HasMany(x => x.Roles)
            //  .Inverse()
            //  .Cascade.All();
        }
    }
}

private static ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
          .Database(MsSqlConfiguration.MsSql2005
            .ConnectionString(c => c
                .Server(@".\SQLEXPRESS")
                .Database("MyDB")
                .TrustedConnection())
            )                                                     
          .Mappings(m => m
            .FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())
            .ExportTo(@"C:\Development\MVC\DataAccess\hbms"))
            .ExposeConfiguration((Configuration config) => new SchemaExport(config).Create(false, true))
          .BuildSessionFactory();
}   

任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您的方案类似于Getting started with Fluent NHibernate中给出的示例中商店和产品的链接。

UserRoles 只是一种链接机制,因此您最好不要将其视为实体。相反,您有一个用户已分配角色和/或角色已分配给用户

所以你可能有:

public class User
{
    public virtual int Id { get; private set; }
    public virtual string DisplayName { get; set; }
    public virtual string Email { get; set; }
    public virtual string Password { get; set; }
    public virtual IList<Role> Roles { get; set; }

    public User()
    {
        Roles = new List<Role>();
    }

    public AddToRole(Role role)
    {
        role.Users.Add(this);
        Roles.Add(role);
    }
}

public class Role
{
    public virtual int Id { get; private set; }
    public virtual string RoleName { get; set; }
    public virtual string RoleDescription { get; set; }
    public virtual IList<User> Users { get; set; }

    public Role()
    {
        Users = new List<User>();
    }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.DisplayName);
        Map(x => x.Email);
        Map(x => x.Password);
        HasManyToMany(x => x.Roles)
          .Table("UserRoles");
    }
}

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleDescription);
        Map(x => x.RoleName);
        HasManyToMany(x => x.Users)
          .Inverse()
          .Table("UserRoles");
    }
}
相关问题