我在运行时为FluentNHibernate的MVC3应用程序收到以下错误,但似乎无法弄清楚映射问题:
UserRole表中的关联引用了未映射的类:Domain.Entities.User 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。
异常详细信息:NHibernate.MappingException:表UserRole中的关联引用了未映射的类:Domain.Entities.User
来源错误: public ISessionFactory CreateSessionFactory() { 返回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();
}
答案 0 :(得分:3)
我认为当你一遍又一遍地调用.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 :(得分:1)
我会更改您将配置添加到配置的方式。布鲁克的答案是正确的,但如果你的映射都在同一个程序集中,我会做这样的事情:
public ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
.Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<UserMap>()
})
//.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
这样,每次创建新映射时都不必将新映射添加到配置中。