NHibernate Fluent添加外部装配映射

时间:2017-02-07 21:25:29

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个项目,我的映射和实体存储在其他类库和NHibernate层中的另一个项目中。在我的测试项目中,我想通过流畅的配置添加这些映射...映射...通过装配而不是单独。在下面的代码中,您可以看到我只添加了一个实体.. 但是我想将其配置为扫描我的其他程序集。我相信我只是错过了这里显而易见的......任何指针都会非常感激......

 [Test]
    public void Can_generate_schemaFluently()
    {
        var cfg = new Configuration();  
        cfg.Configure();

        Configuration configuration = null;
        ISessionFactory SessionFactory = null;
        ISession session = null;

        SessionFactory = Fluently.Configure(cfg)
            *** WOULD LIKE TO ADD MY ASSEBLIES and autoscan for objects instead ***
          .Mappings(m => m.FluentMappings
                        .Add(typeof(StudentEOMap))
                  )
           .ExposeConfiguration(x => configuration = x)
            .BuildSessionFactory();

        session = SessionFactory.OpenSession();

        object id;
        using (var tx = session.BeginTransaction())
        {
            var result = session.Get<StudentEO>(1541057);
            tx.Commit();
            Assert.AreEqual(result.StudId, 1541057);
        }
        session.Close();

    }

1 个答案:

答案 0 :(得分:1)

<强>自动映射

如果您想要过滤类型,可以使用IAutomappingConfiguration并从DefaultAutomappingConfiguration派生,如下所示:

public class StandardConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Type type)
    {
        // Entity is the base type of all entities
        return typeof(Entity).IsAssignableFrom(type);
    }
}

如果您不需要过滤,也可以使用DefaultAutomappingConfiguration。但我的进一步示例使用StandardConfiguration

像这样更改配置,将类型填充到FluentNHibernate:

SessionFactory = Fluently.Configure(cfg)
    .Mappings(m => MapMyTypes(m))
    .ExposeConfiguration(x => configuration = x)
    .BuildSessionFactory();

MapMyTypes方法应如下所示:

private void MapMyTypes(MappingConfiguration m)
{
    m.AutoMappings.Add(AutoMap.Assemblies(new StandardConfiguration(), 
        Assembly.GetAssembly(typeof(Entity)), 
        Assembly.GetAssembly(typeof(OtherAssemblyEntity)))
    );
}

您可以添加多个程序集,并通过StandardConfiguration进行过滤。

<强> 修改

<强> FluentMappings

我似乎误解了你的问题。要添加映射,您可以使用类似的方法来实现该目标,但不能使用IAutomappingConfiguration。 只需将MapMyTypes方法更改为:

即可
private void MapMyTypes(MappingConfiguration m)
{
    m.FluentMappings.AddFromAssembly(Assembly.GetAssembly(typeof(EntityMap)));
}

<强>联合

您还可以将FluentMapping和AutoMapping结合使用,如下所示:

private Action<MappingConfiguration> MapMyTypes()
{
    return m =>
    {
        MapFluent(m);
        MapAuto(m);
    };
}