流利的nhibernate配置无法正常工作

时间:2014-01-17 16:26:48

标签: c# configuration fluent-nhibernate

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发现:

     

没有找到

     

约定

     

扫描来源:

     

没有找到

     

自动映射

     

跳过类型:

     

没有找到

     

候选人类型:

     

没有找到

我已经阅读了大量的文档和问题,似乎我遗漏了一些非常明显的东西:(

3 个答案:

答案 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,可以使用流畅的配置来查找我的映射。