سؤال

إعادة صياغة من هذه الوثائق MSDN ...

يتم إنشاء عبارة إدراج بواسطة إطار الكيان وتنفيذها على مصدر البيانات عندما يتم استدعاء Savechanges على ObjectContext.

إذا نجحت عملية الإدراج ، يتم كتابة القيم التي تم إنشاؤها بواسطة الخادم إلى ObjectStateentry. عندما يتم استدعاء AcceptChanges تلقائيًا في نهاية تنفيذ Savechanges ، يتم حساب entitykey الدائم باستخدام القيم الجديدة التي تم إنشاؤها.

لا يبدو أن هذا يحدث في الكود الخاص بي. عندما أتصل ObjectContext.SaveChanges(), ، و UpdateException يتم إلقاؤه InnerException.Message القيمة:

"قيمة المفتاح المكررة تنتهك قيود فريدة من نوعها student_term_data_pkey"

هنا هو الرمز المخالف:

using (DataAccessLayerEntities context = new DataAccessLayerEntities()) {
     StudentTermData mostCurrent = new StudentTermData() {
          // Foreign keys:    
          StudentId = studentId,
          TermId = currentTerm.Id,

          // Non-nullable properties:
          SponsorCode = string.Empty,
          AdmissionNumber = string.Empty,
          Expiration = string.Empty
     };

     context.StudentTermDatas.AddObject(mostCurrent);
     context.SaveChanges();  // UpdateException occurs here.
}

لقد تحقق من ذلك StudentTermData.Id تم وضع علامة على أنه كيان في نموذج بيانات الكيان الخاص بي. هل هناك أحد لديه فكرة أو إقتراح؟

هل كانت مفيدة؟

المحلول

كانت هذه المشكلة ناتجة عن وجود خطأ في EF4 حيث لا يقوم مصمم EF بتعيين سمة storegeneratedpattern في SSDL. تم توثيق المشكلة في هذه المدونة و تذكرة Microsoft Connect هذه.

كان الحل هو فتح ملف .edml من النموذج الخاص بي في محرر نصوص ، حدد موقع <EntityType Name="student_term_data"> علامة XML ، وأضف StoreGeneratedPattern="Identity" إلى علامة الملكية المستخدمة ككيانكي:

  <EntityType Name="student_term_data">
     <Key><PropertyRef Name="id" /></Key>
     <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
     ...
  </EntityType>

ثم قمت بإعادة فتح النموذج الخاص بي في مصمم EF ، وقمت بتغيير بسيط (نقل موقع كيان) وحفظه. تسبب هذا في تشغيل مولد الكود ، ويفترض أن يزامن CDSL مع SSDL.

يعمل الكود الخاص بي الآن كما هو متوقع.

نصائح أخرى

تعديل

إذا كنت تحاول القيام بإدراج ، فلا تملأ حقل PK (أعتقد أن هذا طالب).

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