C# FluentNHibernate,映射关联错误

C# FluentNHibernate,映射关联错误,c#,fluent-nhibernate,C#,Fluent Nhibernate,对于使用FluentNHibernate的MVC3应用程序,我在运行时遇到以下错误,但似乎无法解决映射问题: 来自表UserRole的关联引用未映射的类:Domain.Entities.User 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:NHibernate.MappingException:来自表UserRole的关联引用未映射的类:Domain.Entities.User 源错误: 公共ISessionFacto

对于使用FluentNHibernate的MVC3应用程序,我在运行时遇到以下错误,但似乎无法解决映射问题:

来自表UserRole的关联引用未映射的类:Domain.Entities.User 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:NHibernate.MappingException:来自表UserRole的关联引用未映射的类:Domain.Entities.User

源错误: 公共ISessionFactory CreateSessionFactory() { 流畅地返回。Configure() .数据库(MsSqlConfiguration.MsSql2008 .ConnectionString(c=>c.FromConnectionString WithKey(“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);
    }
}

我认为,当您反复调用
.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();
    }

我认为,当您反复调用
.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();
    }

我会改变您将映射添加到配置的方式。Brook的回答是正确的,但如果您的映射都在同一个程序集中,我会这样做:

public ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
                       .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                       .Mappings(m => 
                       {
                        m.FluentMappings.AddFromAssemblyOf<UserMap>()
                       })
                       //.ExposeConfiguration(BuildSchema)
                       .BuildSessionFactory();
}
public ISessionFactory CreateSessionFactory()
{
流畅地返回。Configure()
.数据库(MsSqlConfiguration.MsSql2008
.ConnectionString(c=>c.FromConnectionString WithKey(“AppData”))
.Mappings(m=>
{
m、 FluentMappings.AddFromAssemblyOf()的
})
//.ExposeConfiguration(构建架构)
.BuildSessionFactory();
}

这样,您就不必在每次创建新映射时都将新映射添加到配置中。

我会更改您将映射添加到配置中的方式。Brook的回答是正确的,但如果您的映射都在同一程序集中,我会这样做:

public ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
                       .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                       .Mappings(m => 
                       {
                        m.FluentMappings.AddFromAssemblyOf<UserMap>()
                       })
                       //.ExposeConfiguration(BuildSchema)
                       .BuildSessionFactory();
}
public ISessionFactory CreateSessionFactory()
{
流畅地返回。Configure()
.数据库(MsSqlConfiguration.MsSql2008
.ConnectionString(c=>c.FromConnectionString WithKey(“AppData”))
.Mappings(m=>
{
m、 FluentMappings.AddFromAssemblyOf()的
})
//.ExposeConfiguration(构建架构)
.BuildSessionFactory();
}

这样,您就不必每次创建新映射时都将新映射添加到配置中。

源代码是您的朋友:)第84行足够正确。非常感谢!源代码是您的朋友:)第84行足够正确。非常感谢!