Позвольте мне кое-что прояснить. Тот факт, что у сущностей есть навигационные свойства, не означает, что вы не можете их создавать. Ваше восприятие того, что у вас есть ловушка 22 с «не может создать одно без другого, но не может создать другое без одного», не совсем так, как работает EF.
Есть простой способ сделать это. В следующем примере используется анонимный делегат (лямбда-выражение) для первого создания клиента. После возврата операции с сервера выражение делегата / лямбда обрабатывает завершенное событие и позволяет сохранить адрес для этого клиента.
Эта модель предполагает, что у вас есть отношения 1 ко многим между клиентом и адресом ... иначе: 1 у клиента может быть много адресов. Поле Id для клиента - это внешний ключ в Address (CustomerId).
private void SaveCustomerAndAddress()
{
CustomerContext context = new CustomerContext();
Customer c = new Customer();
c.Name = "Daniel";
context.Customers.Add(c);
context.SubmitChanges( submitChangesComplited =>
{
//Lambda expressions. Executes when the Completed event fires for the
//SubmitChanges. At this point the Customer entity that was created
//will have its Id assigned by the context, so you can access it
//from within the lambda expression block.
Address address = new Address();
address.CustomerId = c.Id;
address.Name = "Home Address";
address.State = "CA";
address.City = "San Diego";
context.Addresses.Add(address);
context.SubmitChanges();
}, null);
}
Однако, если у вас очень простые отношения между клиентами и адресами, вам нужно проявить немного больше творчества. Действия заключаются в следующем: 1. Сохранить клиента 2. Сохранить адрес 3. Создать запись в объединенной таблице для ассоциации CustomerAddress.
Примечание. Использование лямбда-выражений немного упрощает работу, потому что у вас есть возможность доступа к переменным вне лямбда-выражений, если они объявлены в одном методе. В противном случае для каждой операции вы должны сохранять объекты в «состоянии», если для достижения того, что вы хотите, требуется более одной операции:
person
Community
schedule
02.06.2011