Я пробую Entity Framework 4.0, и вот самая упрощенная версия случая -
У меня есть следующие две связанные таблицы:
Адрес
Идентификатор
Город
Клиент
Идентификатор
AddressId
Имя
Я загрузил адреса в ComboBox. Все, что я хочу, это ввести имя клиента в TextBox, выбрать адрес из ComboBox в качестве адреса клиента и нажать кнопку «Сохранить». Я хочу, чтобы мой клиент был сохранен в таблице клиентов. Вот что я пробовал -
/*loads Addresses to the ComboBox*/
private void LoadData()
{
using (CAEntities ctx = ModelAccess.GetContext())
this.AddressList = ctx.Addresses.ToList();
}
/*(tries) to insert the Client to the database*/
private void Save()
{
/*here this.Client is the Client object that is instantiated & initialized
by previous code and this.Address is the SelectedItem of the ComboBox*/
this.Client.Address = this.Address;
using (CAEntities ctx = ModelAccess.GetContext())
{
ctx.Clients.AddObject(this.Client);
ctx.SaveChanges();
}
}
Джули Лерман в Programming Entity Framework говорит, что ...Because the
entities are joined, you can add either entity, and it will bring along the rest of the graph...
Но то, что у меня есть, это InvalidOperationException, в котором говорится: «Свойство EntityKey может быть установлено только тогда, когда текущее значение свойства равно null».
Если я использую -
this.Client.AddressId = this.Address.Id;
вместо -
this.Client.Address = this.Address;
Клиент вставляется в базу данных отлично. Но я думаю, что я также должен иметь возможность напрямую связывать Сущности друг с другом, верно?
Я предположил, что проблема связана с отдельным контекстом, который я создаю. Итак, я попробовал это -
private void Save()
{
this.Client.Address = this.Address;
using (CAEntities ctx = ModelAccess.GetContext())
{
ctx.Addresses.Attach(this.Address);
ctx.SaveChanges();
}
}
но на этот раз я получаю InvalidOperationException, в котором говорится: «Объект с временным значением EntityKey не может быть присоединен к контексту объекта». Так что же я здесь делаю не так? Заранее спасибо.
SelectedItem
в качестве this.Address, и я получаю из него свойства Id и City. - person atiyar   schedule 31.08.2012SelectedItem
поля со списком к этому адресу в моей ViewModel. поэтому всякий раз, когда изменяетсяSelectedItem
, я не должен получать адресный объект?SelectedItem
, как указано здесь msdn.microsoft.com/en-us/library/ возвращаетSystem.Object
, и вы можете привести его к своему пользовательскому объекту, я прав? - person atiyar   schedule 31.08.2012