2010-01-17 113 views
1

我已經搜索了一個解決方案盡我所能,但它似乎我在一個地方的損失。這是我第一次進入NHibernate的流利NHibernate &。需要幫助w/NFLuent休眠映射

短版本(這將仍然很長)是我有一個數據庫具有表User,Role,UserRoles。它們之間的關係應該相當直觀......用戶可以分配多個角色。 UserRoles表存儲這些關聯,所以用戶&角色不直接鏈接。我想我需要一個多對多的關係,但我不知道如何映射NFLuent。

我已經完成了NFLuent入門頁面的示例並使其工作。我試圖從中猜出答案,但我錯過了某個地方的某些東西。

我會列出我的實體在第二&映射,但我得到的錯誤是:創建一個會話使用

一個無效或不完整的配置。請參閱PotentialReasons集合和InnerException以獲取更多詳細信息。

的潛在原因,收集並沒有說什麼,但說的InnerException:

{「無法確定類型:DataAccess.Entities.User,數據訪問,版本= 1.0.0.0,文化=中性公鑰=空,爲列:NHibernate.Mapping.Column(用戶)「}

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

我可以在必要時發佈我的HBM文件。 – jason

回答

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"); 
    } 
} 
+0

哦,你真棒!那就是訣竅。我從示例中添加了一些內容: 向用戶和角色實體添加了構造函數,以將IList初始化爲相應對象的新列表。 將虛擬AddUser,AddRole方法添加到各個實體以添加用戶和角色。 我當時能夠成功地調用NHibernate來保存數據。這真是太棒了。再次感謝!我知道答案就在這個例子中,但我無法拼湊出我錯過的東西。我記得它說這樣的關係必須映射到兩端,但我不知道如何。謝謝 – jason