Fluent nhibernate 如何在运行时检测NHibernate有多个映射?
为了进行测试,我试图在运行时检测实体中的多个关系。我遇到过很多人编写错误映射的问题,所以我编写了一个测试来测试我们的持续集成服务器上的每个映射 现在,我可以通过检测映射的Id属性并调用.Get()或复合getter来测试每个实体,包括复合实体和非复合实体。其中大部分是使用反射完成的。我在检查每个实体类型时使用GetClassMetadata 但是我错过了一些坏掉的东西的测试,一个非常多的测试。 我使用的是Fluent NHibernate,映射为:Fluent nhibernate 如何在运行时检测NHibernate有多个映射?,fluent-nhibernate,runtime,many-to-many,Fluent Nhibernate,Runtime,Many To Many,为了进行测试,我试图在运行时检测实体中的多个关系。我遇到过很多人编写错误映射的问题,所以我编写了一个测试来测试我们的持续集成服务器上的每个映射 现在,我可以通过检测映射的Id属性并调用.Get()或复合getter来测试每个实体,包括复合实体和非复合实体。其中大部分是使用反射完成的。我在检查每个实体类型时使用GetClassMetadata 但是我错过了一些坏掉的东西的测试,一个非常多的测试。 我使用的是Fluent NHibernate,映射为: mapping.HasMany
mapping.HasManyToMany<ServiceType>(x => x.ServiceTypes)
.Schema("Marketplace")
.Table("ListingServiceTypes")
.ParentKeyColumn("PackageID")
.ChildKeyColumn("ServiceTypeID")
.Cascade.SaveUpdate().LazyLoad();
mapping.HasManyToMany(x=>x.ServiceTypes)
.Schema(“市场”)
.Table(“列表服务类型”)
.ParentKeyColumn(“PackageID”)
.ChildKeyColumn(“ServiceTypeID”)
.Cascade.SaveUpdate().LazyLoad();
现在,因为没有实体可以“测试”这种关系,所以我不会对它进行检查。
我需要知道的是,如何找到映射为“HasManyToMany”的对象的属性。我可以很好地调用它们,只要我能检测到它们
我不想强制延迟加载每个集合,因为如果单个实体的映射是正确的,映射将是正确的,因为我们对它们使用约定
public class MyMappingConfiguration : DefaultAutomappingConfiguration
{
public override IEnumerable<IAutomappingStep> GetMappingSteps(AutoMapper mapper, IConventionFinder conventionFinder)
{
var steps = base.GetMappingSteps(mapper, conventionFinder);
var finalSteps = steps.Where(c => c.GetType() != typeof(FluentNHibernate.Automapping.Steps.HasManyToManyStep)).ToList();
var idx = finalSteps.IndexOf(steps.Where(c => c.GetType() == typeof(PropertyStep)).First());
finalSteps.Insert(idx + 1, new MyCustomHasManyStep(this));
return finalSteps;
}
}
公共类MyMappingConfiguration:DefaultAutomappingConfiguration
{
公共覆盖IEnumerable GetMappingSteps(自动映射映射器、IConventionFinder conventionFinder)
{
var steps=base.GetMappingSteps(映射器、conventionFinder);
var finalSteps=steps.Where(c=>c.GetType()!=typeof(FluentNHibernate.Automapping.steps.HasManyToManyStep)).ToList();
var idx=finalSteps.IndexOf(steps.Where(c=>c.GetType()==typeof(PropertyStep)).First());
最后一步插入(idx+1,新的MyCustomHasManyStep(this));
返回最后一步;
}
}
public class MyMappingConfiguration : DefaultAutomappingConfiguration
{
public override IEnumerable<IAutomappingStep> GetMappingSteps(AutoMapper mapper, IConventionFinder conventionFinder)
{
var steps = base.GetMappingSteps(mapper, conventionFinder);
var finalSteps = steps.Where(c => c.GetType() != typeof(FluentNHibernate.Automapping.Steps.HasManyToManyStep)).ToList();
var idx = finalSteps.IndexOf(steps.Where(c => c.GetType() == typeof(PropertyStep)).First());
finalSteps.Insert(idx + 1, new MyCustomHasManyStep(this));
return finalSteps;
}
}
公共类MyMappingConfiguration:DefaultAutomappingConfiguration
{
公共覆盖IEnumerable GetMappingSteps(自动映射映射器、IConventionFinder conventionFinder)
{
var steps=base.GetMappingSteps(映射器、conventionFinder);
var finalSteps=steps.Where(c=>c.GetType()!=typeof(FluentNHibernate.Automapping.steps.HasManyToManyStep)).ToList();
var idx=finalSteps.IndexOf(steps.Where(c=>c.GetType()==typeof(PropertyStep)).First());
最后一步插入(idx+1,新的MyCustomHasManyStep(this));
返回最后一步;
}
}
var CollectionMetaData = SessionFactory.GetCollectionMetadata(T.FullName + '.' + info.Name);
if (CollectionMetaData is NHibernate.Persister.Collection.BasicCollectionPersister)
{
if (((NHibernate.Persister.Collection.BasicCollectionPersister)CollectionMetaData).IsManyToMany)
{
//Do something.
}
}
其中T是类型,info是来自T的属性信息。GetProperties()必须今天这样做
var CollectionMetaData = SessionFactory.GetCollectionMetadata(T.FullName + '.' + info.Name);
if (CollectionMetaData is NHibernate.Persister.Collection.BasicCollectionPersister)
{
if (((NHibernate.Persister.Collection.BasicCollectionPersister)CollectionMetaData).IsManyToMany)
{
//Do something.
}
}
其中T是类型,info是来自T.GetProperties()的属性信息