Fluent nhibernate 如何在运行时检测NHibernate有多个映射?

Fluent nhibernate 如何在运行时检测NHibernate有多个映射?,fluent-nhibernate,runtime,many-to-many,Fluent Nhibernate,Runtime,Many To Many,为了进行测试,我试图在运行时检测实体中的多个关系。我遇到过很多人编写错误映射的问题,所以我编写了一个测试来测试我们的持续集成服务器上的每个映射 现在,我可以通过检测映射的Id属性并调用.Get()或复合getter来测试每个实体,包括复合实体和非复合实体。其中大部分是使用反射完成的。我在检查每个实体类型时使用GetClassMetadata 但是我错过了一些坏掉的东西的测试,一个非常多的测试。 我使用的是Fluent NHibernate,映射为: mapping.HasMany

为了进行测试,我试图在运行时检测实体中的多个关系。我遇到过很多人编写错误映射的问题,所以我编写了一个测试来测试我们的持续集成服务器上的每个映射

现在,我可以通过检测映射的Id属性并调用.Get()或复合getter来测试每个实体,包括复合实体和非复合实体。其中大部分是使用反射完成的。我在检查每个实体类型时使用GetClassMetadata

但是我错过了一些坏掉的东西的测试,一个非常多的测试。 我使用的是Fluent NHibernate,映射为:

        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”的对象的属性。我可以很好地调用它们,只要我能检测到它们

我不想强制延迟加载每个集合,因为如果单个实体的映射是正确的,映射将是正确的,因为我们对它们使用约定

  • 获取FluentNHibernate的源代码,并复制到您的项目HasManyToManyStep.cs(FluentNHibernate.Automapping.Steps)

  • 将逻辑添加到ShouldMap()方法。FNH调用此方法来检测多对多关系。您可以改变确定多对多关系的方式(例如,通过属性)。在您的情况下,您可能希望通过反射添加属性来标记属性

  • 用新步骤替换默认步骤:

    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));
    返回最后一步;
    }
    }
    
  • 获取FluentNHibernate的源代码,并复制到您的项目HasManyToManyStep.cs(FluentNHibernate.Automapping.Steps)

  • 将逻辑添加到ShouldMap()方法。FNH调用此方法来检测多对多关系。您可以改变确定多对多关系的方式(例如,通过属性)。在您的情况下,您可能希望通过反射添加属性来标记属性

  • 用新步骤替换默认步骤:

    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()的属性信息