6

我所有的实体和值对象都实现了标记接口IEntityIValueObject. 我已将它们设置为像这样对待组件:

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; }
}

有没有办法定义一个约定,这样,只要 anIEntity有一个IList实现的类型IValueObject,它就会像我指定的那样被映射:

HasMany(x => x.Objects)
    .Component(x => { 
        x.Map(m => m.Name); 
        x.Map(m => m.Value); 
    });

我不想做的是必须为每个类手动执行这些覆盖,并一次又一次地写出值对象的每个属性。

4

1 回答 1

1
  1. 创建一个继承自 HasManyStep (FluentNHibernate.Automapping.Steps) 的新类。
  2. 用类似的东西覆盖 ShouldMap() 方法:

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

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

    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; 
        }
    }
    

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

于 2011-11-14T16:23:08.747 回答