NHibernate Fluent 添加外部程序集映射
NHibernate Fluent Add external Assembly mappings
我有一个项目,我的映射和实体存储在另一个项目的其他 class 库和 NHibernate 层中。在我的测试项目中,我想通过流利配置添加这些映射...映射...通过 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();
}
自动映射
如果要过滤类型,可以使用 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);
};
}
我有一个项目,我的映射和实体存储在另一个项目的其他 class 库和 NHibernate 层中。在我的测试项目中,我想通过流利配置添加这些映射...映射...通过 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();
}
自动映射
如果要过滤类型,可以使用 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);
};
}