سؤال

لقد تم تكليفي بالمهمة المجيدة المتمثلة في تحديث نظام CRUD (المثير للسخرية).أنا أستخدم EF 6.1.1 وWebApi.أقوم بإرسال الكيان باستخدام DTO (سيقوم الكائن الديناميكي في الوقت الحالي بإنشاء نوع ثابت عندما يعمل كل شيء، وسيقوم أيضًا بإجراء المكالمات async)

[HttpGet]
public dynamic Get(int id)
{
    var p = personRepository.Get(id);

    return new
    {
        p.PersonId,
        p.BirthYear,
        p.DeathYear,
        p.Comment,
        PersonNames = p.PersonNames.Select(pn => new { pn.PersonId, pn.PersonNameId, pn.NameTypeId, pn.Firstname, pn.Prefix, pn.Surname })
    };
}

ثم أقوم بتحديث الحقول الموجودة على Person كائن أو إضافة/إزالة/تحديث PersonNames جمع باستخدام Knockout و ko.mapping

أقوم بنشر النتيجة على طريقة WebApi هذه

[HttpPost]
public void Post([FromBody]Person person)
{
    personRepository.Merge(person);
}

جميع المعرفات وما إلى ذلك صحيحة، في personRepository.Merge لقد حاولت

public void Merge(Person person)
{
    db.People.AddOrUpdate(person);
    db.SaveChanges();
} 

يعمل هذا مع الحقول الموجودة مباشرة في كائن الشخص، ولكنه لا يعمل مع إضافة/إزالة/تحديث على PersonNames

هل يمكنني دعم هذا دون كتابة رمز الدمج اليدوي؟

حلانتهى الأمر بفعل هذا

public void Merge(Person person)
{
    db.People.AddOrUpdate(person);
    var existingNames = db.PersonNames.Where(pn => pn.PersonId == person.PersonId).ToList();
    var deleted = existingNames.Where(pn => person.PersonNames.All(d => d.PersonNameId != pn.PersonNameId));
    db.PersonNames.RemoveRange(deleted);

    foreach (var name in person.PersonNames)
    {
        db.PersonNames.AddOrUpdate(name);
    }
    db.SaveChanges();
}
هل كانت مفيدة؟

المحلول

نظرًا لأنك ذكرت أن هذا نظام CRUD، فإن كل هذا يبدو معقولًا بالنسبة لي.لا أستطيع أن أرى كيف يمكنك حقًا تجنب التعيين من DTO الخاص بك إلى كيانات المجال الخاص بك (على سبيل المثال.شخص)

أتوقع أنك فكرت في الأمر بالفعل، ولكن ماذا عن إزالة أكبر قدر ممكن من كود دمج لوحة الغلاية باستخدام شيء مثل AutoMapper؟ https://github.com/AutoMapper/AutoMapper

يصبح رسم الخرائط معقدًا بالنسبة للخصائص الملاحية (أي.التعيين بين الرسم البياني للكائن من DTO إلى الرسم البياني للكائن للكيانات).هذا الرابط يتناول تفاصيل أكثر بكثير مما أستطيع: http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top