6

Tüm varlıklarım ve değer nesneleri, IEntity işaretleme arabirimlerini ve IValueObject numaralarını uygular. Öyle gibi bileşenler olarak muamele etmelerini kurdunuz:Fluent NHibernate ile bileşenlerin bir koleksiyonu nasıl otomatik olarak oluşturulur?

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

Maalesef bu değer nesnelerin koleksiyonları bileşeni koleksiyonları olarak automapped gereken kuruluşlara izin vermiyor. Örneğin:

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

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

her zaman bir IEntity IValueObject uygulayan bir tipte bir IList sahip olacak şekilde, bir kongre tanımlamak için herhangi bir şekilde var, ı belirtilen sanki eşleştirilmiş alır:

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

Yapmak istemediğim, her sınıf için bu geçersiz kılmaları elle yapmak ve her bir özelliği tekrar ve tekrar değer nesnesine yazmak zorundadır.

cevap

0
  1. HasManyStep'den (FluentNHibernate.Automapping.Steps) gelen yeni bir sınıf oluşturun.
  2. geçersiz kılma gibi bir şeyle ShouldMap() yöntemi:

    return base.ShouldMap(member) && IsCollectionOfComponents(member) 
    
  3. için mantık ekleyin:

    public void Map(ClassMappingBase classMap, Member member) 
    { ... } 
    
  4. sizin yenisi ile varsayılan adımı değiştirin:

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

Not: HasManyStep.cs'in orijinal kaynak kodunu da alabilir ve özel mantığınızı tanıtmak için projenize kopyalayabilirsiniz.

İlgili konular