لماذا يمكن أن يتمكن إطار الكيان من استرداد الكيانات ولكن لا يحفظ/تحديث/حذفها؟
-
23-09-2019 - |
سؤال
انا املك WPF التطبيق مع ملف .mdf المحلي التي أنشأت عليها إطار كيان نموذج الطبقة.
الاسترداد كيانات من قاعدة البيانات يعمل بشكل جيد:
//get entities
using (var context = new TestDataEntities1())
{
var customers = from c in context.Customers
select c;
foreach (var customer in customers)
{
TheCustomers.Add(customer);
}
}
لكن، تحديث و مضيفا و حذف* لا. لا يوجد خطأ **, ، يخطو تصحيح الأخطاء مباشرة ، لا توجد رسائل في الإخراج ، ولكن البيانات في جدول قاعدة البيانات لا يزال دون تغيير.
//update entity
using (var context = new TestDataEntities1())
{
var customer = (from c in context.Customers
where c.Id == 1
select c).FirstOrDefault();
customer.FirstName = DateTime.Now.ToString();
int num = context.SaveChanges(); //returns 1, table unchanged
}
//add entity
using (var context = new TestDataEntities1())
{
var customer = new Models.Customers();
customer.FirstName = "Ned";
customer.LastName = "Newton";
context.AddToCustomers(customer);
int num = context.SaveChanges(); //returns 1, table unchanged
}
//delete entity
using (var context = new TestDataEntities1())
{
var customer = (from c in context.Customers
where c.Id == 2
select c).FirstOrDefault();
context.Detach(customer); // table unchanged
}
ما الذي يجب علي فعله للحصول على إطار كيان لتحديث وإضافة كيانات إلى جدول قاعدة البيانات؟
المحلول
أولاً، SaveChanges
لا يضمن تحديث. يرجع تم تغيير # من الصفوف. لذا تحقق من قيمة الإرجاع. إذا كان 0 ، فإن EF لا فكر في قام بتحديث. إذا كان> 0 فهذا يفعل.
ثانياً ، يجب عليك ملف تعريف SQL لمعرفة ما ترسله EF.
إذا كانت نتيجة SaveChanges
هو 0 ، فمن المؤكد أن السبب هو أن EF لا تعتقد أن أي شيء في السياق يتم تعديله. لماذا يعتمد ذلك على كيفية تتبع تغييراتك. الرمز الخاص بك أعلاه يبدو صحيحا لإدراج ، ولكن لتحديث ApplyPropertyChanges
لا لزوم له ويجب إزالته.
إذا كانت EF ترسل SQL ولكن DB لا يفعل شيئًا معها ، فيجب عليك فحص SQL لإصلاح.