6

मेरी सभी संस्थाएं और मूल्य वस्तुएं मार्कर इंटरफेस IEntity और IValueObject लागू करती हैं। मैं उन्हें निर्धारित किया है ताकि जैसे घटकों के रूप में इलाज किया जाना है: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); 
    }); 

जो मैं नहीं करना चाहता हूं उसे प्रत्येक कक्षा के लिए इन ओवरराइड मैन्युअल रूप से करना है और मूल्य वस्तु के लिए प्रत्येक संपत्ति को बार-बार लिखना है।

उत्तर

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 का मूल स्रोत कोड भी प्राप्त कर सकते हैं और इसे अपने कस्टम तर्क को पेश करने के लिए अपनी प्रोजेक्ट में कॉपी कर सकते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^