Вставить объект в EntityCollection с RIA

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

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

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

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 добавляет мой объект и вызывает его собственный метод вставки. Итак, я сначала прокатился с ним и просто установил свойство в пользовательском интерфейсе, тогда это выдало бы мне эту ошибку:

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

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


person Mike    schedule 14.08.2010    source источник


Ответы (1)


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

person Robert Koch    schedule 16.08.2010
comment
Спасибо, Роб, да, все, что мне нужно было сделать, это обновить метаданные. Х_х - person Mike; 17.08.2010