Нужна помощь с отображениями Hibernate NFLuent - PullRequest
1 голос
/ 17 января 2010

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

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

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

Я перечислю свою сущность и сопоставления через секунду, но ошибка, которую я получаю:

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

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

{"Не удалось определить тип для: DataAccess.Entities.User, DataAccess, Version = 1.0.0.0, Culture = нейтральный, 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 голосов
/ 17 января 2010

Ваш сценарий аналогичен связыванию Магазина и Продуктов в примере, приведенном в Начало работы с 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");
    }
}
...