c# - شرح - كيفية تجاهل خاصية الخاصية في رسم الخرائط التلقائي؟




كيفية حل الخرائط الكنتورية (2)

وأعتقد أن المشكلة التي تواجهها تأتي من افتراض خاطئ أن المجموعات في PersonDTO.Groups هي نفسها غروبتو - لا يمكن أن يكون ذلك من دون حلقة التبعية لانهائية. يجب أن تعمل الشفرة التالية نيابة عنك:

CreateMap<Person, PersonDTO>()
    .ForMember(x => x.Groups, opt => opt.Ignore())
    .ReverseMap()
    .AfterMap((src, dest) => 
    {
        dest.Groups = src.Groups.Select(g => new GroupDTO { Name = g.Name }).ToList()
    });

CreateMap<Group, GroupDTO>()
    .ForMember(x => x.Members, opt => opt.Ignore())
    .ReverseMap()
    .AfterMap((src, dest) => 
    {
        dest.Members = src.Members.Select(p => new PersonDTO { Name = p.Name }).ToList()
    });

تحتاج أساسا لتعليم أوتومابر أنه في حالة personDTO.Groups الخاصية يجب أن تعين غروبتو الكائنات بشكل مختلف.

ولكني أعتقد أن مشكلتك تشبه مسألة معمارية أكثر من الكود الأول. بيرسوندو. غروبس لا ينبغي أن يكون من نوع غروبدتو - أنت هنا مهتم فقط في مجموعات ينتمي إليها مستخدم معين وليس أعضاء آخرين من مجموعاته. يجب أن يكون لديك نوع أبسط مثل:

public class PersonGroupDTO
{
    public string Name { get; set; }
}

(الاسم متروك لك بالطبع) لتحديد المجموعة فقط دون تمرير أعضاء إضافيين.

صورة Person وفئة Group مع العديد من العلاقة إلى الكثير. الشخص لديه قائمة من المجموعات ومجموعة لديها قائمة من الناس.

عند تعيين Person إلى PersonDTO لدي stack overflow exception لأن أوتومابر لا يمكن التعامل مع Person > Groups > Members > Groups > Members > ...

حتى هنا رمز المثال:

public class Person
{
    public string Name { get; set; }
    public List<Group> Groups { get; set; }
}

public class Group
{
    public string Name { get; set; }
    public List<Person> Members { get; set; }
}

public class PersonDTO
{
    public string Name { get; set; }
    public List<GroupDTO> Groups { get; set; }
}

public class GroupDTO
{
    public string Name { get; set; }
    public List<PersonDTO> Members { get; set; }
}

عند استخدام .ForMember في إنشاء مصمم خرائط أول مخطط الذي يتم تنفيذه يلقي null reference exception .

إليك شفرة مصمم الخرائط:

CreateMap<Person, PersonDTO>()
    .ForMember(x => x.Groups.Select(y => y.Members), opt => opt.Ignore())
    .ReverseMap();

CreateMap<Group, GroupDTO>()
    .ForMember(x => x.Members.Select(y => y.Groups), opt => opt.Ignore())
    .ReverseMap();

فماذا أنا في عداد المفقودين أو القيام خطأ؟ عند إزالة أساليب .ForMember لا يتم طرح null reference exception بعد الآن.

تحديث : أريد حقا أن أؤكد على النقطة الرئيسية لسؤالي هو كيفية تجاهل خاصية الممتلكات . هذا الرمز هو مجرد مثال بسيط نوعا ما.

تحديث 2: هذه هي الطريقة التي إصلاحه، شكرا جزيلا ل لوسيان-بارغوانو

CreateMap<Person, PersonDTO>()
    .ForMember(x => x.Groups.Select(y => y.Members), opt => opt.Ignore())
    .PreserveReferences() // This is the solution!
    .ReverseMap();

CreateMap<Group, GroupDTO>()
    .ForMember(x => x.Members.Select(y => y.Groups), opt => opt.Ignore())
    .PreserveReferences() // This is the solution!
    .ReverseMap();

بفضل .PreserveReferences() المراجع الدائرية الحصول على ثابت!








nullreferenceexception