FluentNHibernate, Ошибка сопоставления сопоставления - PullRequest
0 голосов
/ 22 апреля 2011

Я получаю следующую ошибку во время выполнения для моего приложения MVC3 с FluentNHibernate, но, похоже, не могу выяснить проблему сопоставления:

Ассоциация из таблицы UserRole ссылается на не отображенный класс: Domain.Entities.User Описание: Произошло необработанное исключение во время выполнения текущего веб-запроса.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: NHibernate.MappingException: Ассоциация из таблицы UserRole ссылается на не отображенный класс: Domain.Entities.User

Ошибка источника: public ISessionFactory CreateSessionFactory () {return Fluently.Configure () .Database (MsSqlConfiguration.MsSql2008 .ConnectionString (c => c.FromConnectionStringWithKey ("AppData")))

двасоответствующие классы и карты: Не видите, в чем здесь проблема?!

public class User : IUser
{
    public virtual int Id { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Email { get; set; }
    public virtual Guid UserGUID { get; set; }
    public virtual int FileQuota { get; set; }
    public virtual Company Company { get; set; }
    public virtual IList<UserRole> UserRoles { get; set; }
    public virtual IList<CloudFile> CloudFiles { get; set; }
}

public class UserRole : IUserRole
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual User User { get; set; }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.UserName);
        Map(x => x.FirstName);
        Map(x => x.Password);
        Map(x => x.LastName);
        Map(x => x.Email);
        Map(x => x.UserGUID);
        Map(x => x.FileQuota);
        References(x => x.Company);
        HasMany(x => x.UserRoles).Cascade.All();
        HasMany(x => x.CloudFiles).Cascade.All();
    }
}

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);
        References(x => x.User);
    }
}

Есть идеи ??

Добавление моей фабрики сессий:

    public ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                           .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.UserMap)))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.CloudFileMap)))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.CompanyMap)))                               
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.UserRoleMap)))
                           //.ExposeConfiguration(BuildSchema)
                           .BuildSessionFactory();
    }

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Я думаю, что когда вы звоните .Mappings(/*mappings*/) снова и снова, вы по существу сбрасываете сопоставления.

Это работает лучше?

public ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                           .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                           .Mappings(m => 
                           {
                            m.FluentMappings.Add(typeof(Domain.Mappings.UserMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.CloudFileMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.CompanyMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.UserRoleMap));
                           })
                           //.ExposeConfiguration(BuildSchema)
                           .BuildSessionFactory();
    }
1 голос
/ 22 апреля 2011

Я бы изменил способ добавления ваших сопоставлений в вашу конфигурацию. Ответ Брука правильный, но если все ваши сопоставления в одной сборке, я бы сделал что-то вроде этого:

public ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
                       .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                       .Mappings(m => 
                       {
                        m.FluentMappings.AddFromAssemblyOf<UserMap>()
                       })
                       //.ExposeConfiguration(BuildSchema)
                       .BuildSessionFactory();
}

Таким образом, вам не нужно добавлять новое сопоставление в конфигурацию каждый раз, когда вы создаете новое сопоставление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...