[英]FluentNHibernate, Mapping Association Error
I am getting the following error at runtime for my MVC3 application with FluentNHibernate but can't seem to figure out the mapping issue: 对于FluentNHibernate,我的MVC3应用程序在运行时出现以下错误,但似乎无法找出映射问题:
An association from the table UserRole refers to an unmapped class: Domain.Entities.User Description: An unhandled exception occurred during the execution of the current web request. 表UserRole中的关联指的是未映射的类:Domain.Entities.User说明:在执行当前Web请求期间发生未处理的异常。 Please review the stack trace for more information about the error and where it originated in the code.
请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
Exception Details: NHibernate.MappingException: An association from the table UserRole refers to an unmapped class: Domain.Entities.User 异常详细信息:NHibernate.MappingException:表UserRole中的关联引用了未映射的类:Domain.Entities.User
Source Error: public ISessionFactory CreateSessionFactory() { return Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008 .ConnectionString(c => c.FromConnectionStringWithKey("AppData"))) 源错误:公共ISessionFactory CreateSessionFactory(){返回Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 .ConnectionString(c => c.FromConnectionStringWithKey(“ AppData”))))
The two relevant classes and maps: Can't see what the problem is here?! 两个相关的类和映射:看不到这里的问题吗?!
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);
}
}
Any ideas?? 有任何想法吗??
Adding my session factory: 添加我的会话工厂:
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();
}
I think when you call .Mappings(/*mappings*/)
over and over again you're essentially resetting the mappings. 我认为,当您
.Mappings(/*mappings*/)
调用.Mappings(/*mappings*/)
时,实际上就是在重置映射。
Does this work better? 这样效果更好吗?
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();
}
I would change the way you are adding your mappings to your config. 我会更改将映射添加到配置中的方式。 Brook's answer is correct but if your mappings are all in the same assembly I would do something like this:
Brook的答案是正确的,但是如果您的映射都在同一个程序集中,我将执行以下操作:
public ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
.Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<UserMap>()
})
//.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
This way you don't have to add the new mapping to your config every time you create a new mapping. 这样,您不必在每次创建新映射时都将新映射添加到配置中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.