0

我将 NHibernate 用于可以动态加载其模块的动态网站,因此当我想构建 sessionFactory 时,我使用一种方法来查找所有程序集并使用它们的依赖项对它们进行排序,我将它们添加到我创建的配置实例中有用。现在我想将配置类型从 hbm.xml 文件更改为流畅,我添加了以下代码:

 sessionFactory =
    Fluently
    .Configure()
    .Database(
        FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008.ConnectionString(
            c =>  c.FromAppSetting("connectionString")
        )
    )
    .Mappings(
        m => m.AutoMappings.Add(
            AutoMap.Assemblies(
                new FarayanConfig(),
                assembliesArray
            )
        )
   ).BuildSessionFactory();

FarayaConfig 是:

class FarayanConfig : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Type type)
    {
        return type.Name.EndsWith("Entity");
    }
    public override bool IsVersion(FluentNHibernate.Member member)
    {
    return member.Name == "Version";
    }
}

我还在程序集中有一个类,该类将由此代码加载(注意程序集未引用,将动态加载),其中包含一个名为 ControlEntity 的类和另一个类:

public class ControlEntityMap : ClassMap<ControlEntity>
{
    public ControlEntityMap()
    {
        HasMany(x => x.Properties).Component(c => {
            c.Map(v => v.Culture);
            c.Map(v => v.Name);
            c.Map(v => v.Value);
        });
    }
}

现在的问题是 ControlEntityMap 的构造函数不会执行!我应该做什么?

4

1 回答 1

0

因为您正在尝试使用 AutoMap。你可以使用这样的东西:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("your assembly name")))

更新:

对于这种情况,您通过 ovverride DefaultAutomappingConfiguration 做得对,但您也尝试自动映射所有以“实体”结尾的类,而您想要从 AutoMap 忽略它的类也以“实体”结尾。我认为你可以在不同的命名空间中分离你的类并在你的 ShouldMap 属性中声明它。

FluentNhibenate Wiki 中有一些信息:

您可以通过简单地将它们从您的 ShouldMap(Type) 方法中排除来忽略基本类型,这有时是最干净的选择;但是,如果您想更明确一点,可以使用 IgnoreBase 方法。

在 AutoMap.AssemblyOf() 之后,我们需要更改自动映射器使用的约定,以便它可以识别我们的基类。

AutoMap.AssemblyOf(cfg) .IgnoreBase();

我们添加了 IgnoreBase 调用,它只是指示自动映射器忽略 Entity 类;您可以根据需要多次链接此调用。

于 2012-09-29T14:29:06.400 回答