我尽可能地寻找解决方案,但似乎我在某处感到茫然。这是我第一次进入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();
}
任何建议将不胜感激。谢谢!
答案 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");
}
}