Я искал решение как можно лучше, но, похоже, я где-то в растерянности. Это мое первое погружение в 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();
}
Любые предложения будут оценены. Спасибо!