我将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();
FarayanConfig是:
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的构造函数不会执行! 我必须做什么?
答案 0 :(得分: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调用,它只是指示 automapper忽略Entity类;你可以把这个电话串起来 根据需要的时间。