كيان دمج EF6 من WebApi
-
20-12-2019 - |
سؤال
لقد تم تكليفي بالمهمة المجيدة المتمثلة في تحديث نظام 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/