Вставьте Entity в EntityCollection с RIA

У меня установлены отношения один ко многим. (Например, Человек со многими телефонными номерами). В моем запросе get у меня есть this.ObjectContext.Person.Include("PhoneNumbers") и в сгенерированных метаданных, включая public EntityCollection<PhoneNumbers> PhoneNumbers{ get; set; } Я также настроил DTO с этим и другими необходимыми мне свойствами.

[Include]
[Association("Name","thisKey","otherKey")]
public IEnumerable<PhoneNumbers> PNums { get; set; }

Я могу получить все данные в порядке, и отобразить их в серебряном свете, но когда я создаю новую, я сталкиваюсь с проблемами. У меня происходит такая вещь:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{

   if (dgMMs.SelectedItem != null)
   {
      PhoneNumbers wb = new PhoneNumbers ();
      wb.this = tbThis.Text;
      wb.that =  tbThat.Text;
      wb.other = tbOther.Text;
      wb.whatnot = tbwhatnot.Text;
      ((Person)dgMMs.SelectedItem).PNums.Add(wb);
   }
}

Тогда я получаю эту ошибку при звонке TDataSource.SubmitChanges();:

Сообщение = "Подтвердить операцию не удалось. Пожалуйста, проверьте Entity.ValidationErrors для каждой сущности в EntitiesInError для получения дополнительной информации".

Хорошо, я сделал это, и, конечно же, есть ошибка, но я не совсем понимаю, почему это так. У меня есть необнуляемое поле в базе данных для поля last_modified_by, которое я не установил, когда создавал и добавлял его в entityCollection, и я предполагаю, что это будет причиной, но мой вопрос возникает из-за того, почему RIA не делает вызовите мой метод Insert в моем сервисе, который я создал, потому что я хочу установить это поле там. Вот так:

public void InsertPhoneNumber(PhoneNumbers pnum)
{
   pnum.last_modified = DateTime.Today;
   pnum.last_modified_by = Thread.CurrentPrincipal.Identity.Name;
   if ((pnum.EntityState != EntityState.Detached))
   {
      this.ObjectContext.ObjectStateManager.ChangeObjectState(pnum, EntityState.Added);
   }
   else
   {
      this.ObjectContext.PhoneNumbers.AddObject(pnum);
   }
}

Но это как будто RIA добавляет мой объект и вызывает его собственный метод Insert. Поэтому я сначала свернулся с этим, и просто установил свойство в пользовательском интерфейсе, а затем я получил бы эту ошибку:

Сообщение = "Операция отправки не удалась. Произошла ошибка при обновлении записей. Подробности смотрите во внутреннем исключении. Внутреннее сообщение об исключении: Невозможно вставить явное значение для столбца идентификации в таблице" iset_trkr_writeback ", когда для IDENTITY_INSERT установлено значение OFF."

Я никогда не устанавливал поле идентичности на что-либо, я думал, что RIA сделает это для меня. Но когда я отлаживаю и смотрю, это имеет 0 для значения. Но, по крайней мере, на этот раз он вызывает мой метод вставки в моем сервисе... Может быть, мне чего-то не хватает в моем процессе, но я действительно мог бы использовать некоторую помощь. Спасибо:)

1 ответ

Решение

Вы используете Entity Framework? Если это так, вам нужен атрибут [Key] хотя бы для одного поля в ваших метаданных. Или создайте столбец идентификаторов /PK (int/guid), а затем обновите метаданные.

Другие вопросы по тегам