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의 원본 소스 코드를 프로젝트에 복사하여 사용자 지정 논리를 소개 할 수도 있습니다.

관련 문제