ObjectContext.SaveChanges () нарушает первичный ключ, выбрасывает UpdateException? - PullRequest
2 голосов
/ 07 сентября 2010

Перефразируя от этой документации MSDN ...

Оператор INSERT генерируется Entity Framework и выполняется на источник данных, когда SaveChanges вызывается на ObjectContext.

Если операция INSERT выполнена успешно, сгенерированные сервером значения записываются вернуться к 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 помечен как EntityKey в моей модели данных Entity. У кого-нибудь есть идеи или предложения?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

Эта проблема была вызвана ошибкой в ​​EF4, когда разработчик EF не устанавливает атрибут StoreGeneratedPattern в SSDL. Проблема задокументирована в этом блоге и в этом билете Microsoft Connect .

Решением было открыть файл .edml моей модели в текстовом редакторе, найти XML-тег <EntityType Name="student_term_data"> и добавить StoreGeneratedPattern="Identity" к тегу свойства, используемому как EntityKey:

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

Затем я снова открыл свою модель в конструкторе EF, внес небольшое изменение (изменил положение объекта) и сохранил. Это вызвало запуск генератора кода, предположительно синхронизируя CDSL с SSDL.

Мой код теперь работает как положено.

0 голосов
/ 07 сентября 2010

РЕДАКТИРОВАТЬ

Если вы пытаетесь выполнить вставку, не заполняйте поле PK (я предполагаю, что это StudentID).

...