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

有沒有什麼辦法來定義一個慣例,例如,在任何時間IEntity具有實現IValueObject的類型的IList,它將映射我彷彿指定:

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

我不想做的是必須爲每個類手動執行這些覆蓋,並一次又一次地寫出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的原始源代碼並將其複製到您的項目中以引入您的自定義邏輯。

相關問題