【问题标题】:NHibernate Fluent Add external Assembly mappingsNHibernate Fluent 添加外部程序集映射
【发布时间】:2017-02-07 21:25:28
【问题描述】:

我有一个项目,我的映射和实体存储在其他类库中,而 NHibernate 层存储在另一个项目中。在我的测试项目中,我想通过 fluently configure... Mappings... 通过 assebly 而不是单独添加这些映射。在下面的代码中,您可以看到我只添加了一个实体。但我想将其配置为扫描我的其他程序集。我确定我只是在这里遗漏了明显的东西。任何指针将不胜感激...

 [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();

    }

【问题讨论】:

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


    【解决方案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);
        };
    }
    

    【讨论】:

    • 我有一个包含我的映射的类库......还有一个包含我的休眠代码的类库,当然还有一个测试库。在测试库中,我想扫描包含我所有实体映射的类库。查看您的示例,看起来我仍然需要提供每个实体映射...我只是在这里没有看到解决方案..抱歉:(您是否有指向您偶然提及的文档的链接?
    • @WarrenLaFrance 您只需提供定义映射的程序集。刚刚使用您的映射类之一选择了程序集。所以没有必要自己选择所有的类。 Assembly.GetAssembly(typeof(EntityMap)) 只选择程序集,而不是类。
    • 好的,那是完美的.. 感谢一百万的指针... cfg {NHibernate.Cfg.Configuration} NHibernate.Cfg.Configuration - ClassMappings Count = 3
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2011-02-09
    • 1970-01-01
    • 2015-06-07
    • 2017-10-18
    • 2011-06-18
    • 2012-04-03
    • 2014-05-26
    相关资源
    最近更新 更多