2010-01-17 3 views
1

Я искал для решения как можно лучше, но, похоже, я где-то в недоумении. Это мое первое погружение в Fluent NHibernate & NHibernate.Нужна помощь с сопоставлениями Hibernate с NFLuent

Короткий вариант (который все еще будет длинным) заключается в том, что у меня есть база данных с таблицами User, Role, UserRoles. Связь b/t их должна быть достаточно интуитивной ... Пользователю может быть назначено несколько ролей. В таблице UserRoles хранятся эти ассоциации, поэтому User & Роль не связывает напрямую. Мне кажется, мне нужно отношение «ко многим ко многим», но я не уверен, как сопоставить это в NFLuent.

Я сделал пример на странице начала работы с NFLuent и заработал. Я попытался догадаться об ответах, но я кое-что упустил.

Я перечислю моему Entity & отображения во втором, но ошибка, я получаю:

недопустимый или неполной конфигурации был использован при создании SessionFactory. Для получения более подробной информации просмотрите коллекцию PotentialReasons и InnerException.

Коллекция Потенциальные причины ничего, кроме InnerException не говорят, говорит:

{ "Не удалось определить тип для: DataAccess.Entities.User, DataAccess, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = NULL для столбцов: NHibernate.Mapping.Column (Пользователь) "}

НВМ файл Вот мои объекты:

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 - всего лишь механизм связывания, поэтому вам лучше не думать об этом как о сущности. Вместо этого, у вас есть Пользователь, который был назначен роли и/или Role, который был назначен пользователей.

Таким образом, вы могли бы:

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

О, мужик, ты потрясающий! Это сделал трюк. Несколько вещей, которые я добавил из примера: Добавлены конструкторы для объектов User & Role для инициализации IList новым списком соответствующего объекта. Добавьте виртуальные AddUser, AddRole методы в соответствующие объекты для добавления пользователей и ролей. Тогда я смог успешно позвонить в NHibernate, чтобы сохранить данные. Это просто потрясающе. Еще раз спасибо! Я знал, что ответ был в этом примере, но я просто не мог собрать то, что мне не хватало.Я помню, что такие отношения должны отображаться на обоих концах, но я не знал, как это сделать. Спасибо – jason