Saa*_*aan 0 nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping
我的公司有多个站点,它们引用相同的DB和Core代码库.然后我们有一个管理数据的CMS.
在Core库中,我有一个Site类,它包含有关每个站点的一堆基本信息.这是我对它的流畅映射.
using Core.Model; // Where Site class exists
namespace Core.Repository.NHibernate.Mappings
{
public class SiteMapping : ClassMap<Site>
{
public SiteMapping()
{
Table("f_site");
Id(x => x.Id, "f_site_id").GeneratedBy.Identity();
Map(x => x.Domain, "domain_name").Not.Nullable();
}
}
}
Run Code Online (Sandbox Code Playgroud)
作为CMS的一部分,我们会记录谁编辑了什么以及何时编辑.但我想只在CMS中引用Log类和映射,而不是在我的核心代码中,因为人们只能通过CMS编辑信息.
这是我当前流向Log类的流程映射,它引用了Site类.
using Core.Model; // where Site class exists
using Cms.Model; // where Log and CmsUser classes exists
namespace Cms.Repository.NHibernate.Mappings
{
public class LogMapping : ClassMap<Log>
{
public LogMapping()
{
Table("f_log");
Id(x => x.Id, "f_log_id").GeneratedBy.Identity();
Map(x => x.Message, "message");
Map(x => x.LogType, "d_log_type_id").CustomType<LogType>();
Map(x => x.LogOperation, "d_log_operation_id").CustomType<LogOperation>();
Map(x => x.Date, "log_date");
References<Site>(x => x.Site, "f_site_id")
.ForeignKey("f_site_id")
.Cascade.None();
References<CmsUser>(x => x.User, "userId")
.ForeignKey("userId")
.Cascade.None();
}
}
}
Run Code Online (Sandbox Code Playgroud)
理论上这很好用,但Log映射错误如下
Cms.Tests.Repository.NHibernate.Repository.TestLogRepository.TestLogMappings:
StructureMap.StructureMapException : StructureMap Exception Code: 207
Internal exception while creating Instance 'e46153a3-2bfe-4279-8749-a42d7a6dd10c' of PluginType Core.Repository.NHibernate.SessionStorage.ISessionContainer`1[[HbmCms.Repository.NHibernate.Mappings.Config.LogMapping, Cms.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Core.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. Check the inner exception for more details.
----> StructureMap.StructureMapException : StructureMap Exception Code: 207
Internal exception while creating Instance '9e72c2ff-e3f4-4b54-9f34-3422a7b982a7' of PluginType Core.Repository.NHibernate.SessionStorage.ISessionFactoryContainer`1[[Cms.Repository.NHibernate.Mappings.Config.LogMapping, Cms.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. Check the inner exception for more details.
----> FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
----> NHibernate.MappingException : An association from the table f_log refers to an unmapped class: Core.Model.Site
Run Code Online (Sandbox Code Playgroud)
有谁知道如何让我的CMS映射引用核心站点映射?这是第一个在两个项目中获得映射的代码,但是我们会做很多事情,因为很多东西你只在CMS中查看和做.如果可以避免,我真的不想将仅CMS的代码放入Core库中.
谢谢您的帮助
桑德拉
"未映射的类"错误通常源于没有记录ClassMap的配置.
在你的FluentConfiguration,你可能有类似的东西:
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<T>())
Run Code Online (Sandbox Code Playgroud)
看来你的两个ClassMaps(至少在帖子中提到的那些)都在不同的程序集中.您可以指定多个程序集:
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<T1>()
.AddFromAssemblyOf<T2>())
Run Code Online (Sandbox Code Playgroud)
要准确查看要映射的内容,可以添加
.Diagnostics(d => d.Enable().OutputToConsole())
Run Code Online (Sandbox Code Playgroud)
到你的FluentConfiguration,它将返回类映射,应用于它们的约定以及为什么/为什么它们不是有效的.
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |