Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Fluent NHibernate自动映射组件集合?_Nhibernate_Fluent Nhibernate_Components_Automapping_Value Objects - Fatal编程技术网

如何使用Fluent NHibernate自动映射组件集合?

如何使用Fluent NHibernate自动映射组件集合?,nhibernate,fluent-nhibernate,components,automapping,value-objects,Nhibernate,Fluent Nhibernate,Components,Automapping,Value Objects,所有我的实体和值对象都实现了标记接口IEntity和IValueObject。我已将它们设置为组件,如下所示: public override bool IsComponent(Type type) { return typeof(IValueObject).IsAssignableFrom(type); } public override bool ShouldMap(Type type) { return typeof(IEntity).IsAssignableFrom(t

所有我的实体和值对象都实现了标记接口
IEntity
IValueObject
。我已将它们设置为组件,如下所示:

public override bool IsComponent(Type type)
{
    return typeof(IValueObject).IsAssignableFrom(type);
}

public override bool ShouldMap(Type type)
{
    return typeof(IEntity).IsAssignableFrom(type) || typeof(IValueObject).IsAssignableFrom(type);
}
不幸的是,这似乎不允许将具有值对象集合的实体自动映射为组件集合。例如:

public class MyEntity : IEntity
{
    public IList<MyValueObject> Objects { get; set; }
}

public class MyValueObject : IValueObject
{
    public string Name { get; set; }
    public string Value { get; set; }
}
我不想做的是对每个类手动执行这些重写,并一次又一次地写出value对象的每个属性

  • 创建一个从HasManyStep继承的新类(FluentNHibernate.Automapping.Steps)
  • 使用以下内容重写ShouldMap()方法:

    return base.ShouldMap(member) && IsCollectionOfComponents(member)
    
  • 将您的逻辑添加到:

    public void Map(ClassMappingBase classMap, Member member)
    { ... }
    
  • 用新步骤替换默认步骤:

    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));
    返回最后一步;
    }
    }
    

  • 注意:您还可以获取HasManyStep.cs的原始源代码,并将其复制到您的项目中,以介绍您的自定义逻辑。

    这是一个极好的答案,它让我对nhibernate自动映射有了很好的了解。
    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; 
        }
    }