Solved:在代码中配置时的ClassMap,在配置文件中配置时的ClassMapping,但是在代码中进行映射。
当尝试将Object1类型的对象保存到我的数据库时,我收到错误:
没有持久性:Object1。
班级定义:
public class Object1
{
public virtual Guid Id { get; protected set; }
public virtual DateTime Created { get; protected set; }
public virtual DateTime LastModified { get; protected set; }
public virtual Other Reference { get; set; }
}
映射:
public class Object1Mapping : ClassMapping<Object1>
{
public Object1Mapping()
{
Id(p => p.Id);
Property(p => p.Created);
Property(p => p.LastModified);
ManyToOne(p => p.Reference, m => m.Cascade(Cascade.Remove));
}
}
配置代码:
sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(c => c
.Server("serverUrl")
.Database("myMsSqlDatabase")
.Username("sa")
.Password("pasword1")))
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<Object1Mapping>()
.AddFromAssemblyOf<Object1>()
.BuildSessionFactory();
我的所有课程都是公开的,我为每个需要持久性的课程添加了AddFromAssemblyOf
。我也试过添加类本身和映射类。我知道一个AddFromAssembly
应该足够,因为应该添加该程序集中的所有映射类,并且我的所有映射类都在一个文件夹中的一个项目中。
我设法运行诊断程序,它正在查看正确的程序集,但它没有发现映射,结果如下:
Fluent Mappings
扫描来源:
Project.DomainModel.NHibernate,Version = 1.0.0.0,Culture = neutral, 公钥=空
Mappings发现:
没有找到
约定
扫描来源:
没有找到
自动映射
跳过类型:
没有找到
候选人类型:
没有找到
我已经阅读了大量的文档和问题,似乎我遗漏了一些非常明显的东西:(
答案 0 :(得分:2)
我认为除了通过foreach添加所有映射外,您都可以这样做。
.Mappings(m =>m.FluentMappings
.AddFromAssemblyOf<Your_Class_For_Fluent_Configuration>()
答案 1 :(得分:1)
Fluently.Configure
支持所有不同的映射类型(通过代码,流畅,自动化,xml ...)。它只需要不同类型的代码片段即可将其添加到您的配置中。
以下是通过Fluently
配置
.Mappings(m =>
{
foreach (var assembly in MapAssemblies)
{
m.FluentMappings.AddFromAssembly(assembly);
m.HbmMappings.AddFromAssembly(assembly);
m.AutoMappings.Add(..)
}
})
...
.ExposeConfiguration(cfg => {
foreach (var assembly in MapAssemblies)
{
cfg.AddDeserializedMapping(HbmMappingHelper.GetMappings(assembly), null);
cfg.AddInputStream(NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetExecutingAssembly()));
}
以上使用过的助手类:
public class HbmMappingHelper
{
public static HbmMapping GetMappings(Type[] types)
{
ModelMapper mapper = new ModelMapper();
foreach (var type in types)
{
mapper.AddMappings(Assembly.GetAssembly(type).GetExportedTypes());
}
return mapper.CompileMappingForAllExplicitlyAddedEntities();
}
public static HbmMapping GetMappings(Assembly assembly)
{
ModelMapper mapper = new ModelMapper();
mapper.AddMappings(assembly.GetExportedTypes());
return mapper.CompileMappingForAllExplicitlyAddedEntities();
}
}
答案 2 :(得分:0)
似乎要在FluentNHibernate中使用映射,您需要与从配置文件配置NHibernate时使用的映射不同的映射。 ClassMapping源自NHibernate.Mapping.ByCode.Conformist和ClassMap(在代码示例中找到)源自FluentNHibernate.Mapping
对此进行了测试,它解决了这个问题,因此将继承类从ClassMapping
更改为ClassMap
,可以使用流畅的配置来查找我的映射。