6

すべてのエンティティと値オブジェクトは、マーカーインターフェイスIEntityIValueObjectを実装しています。私はそうのようなコンポーネントとして扱われるためにそれらを設定している:Fluent NHibernateでコンポーネントのコレクションを自動作成する方法は?

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

残念ながら、これは、値オブジェクトのコレクションを持っているエンティティがコンポーネントのコレクションとしてautomappedすることを許可していないようです。たとえば:

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

public class MyValueObject : IValueObject 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

はいつでも IEntityIValueObjectを実装タイプの IListを持っているように、という規則を定義するためにどのような方法があり、それは私が指定したかのようにマッピングされます:

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

私がしたくないことは、すべてのクラスに対してこれらのオーバーライドを手動で行い、値オブジェクトの各プロパティを何度も書き戻す必要があることです。

答えて

0
  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の元のソースコードを取得してプロジェクトにコピーして、カスタムロジックを導入することもできます。

関連する問題