Позвольте мне кое-что прояснить. То, что у сущностей есть навигационные свойства, не означает, что вы не можете их создавать. Ваше восприятие, что у вас есть уловка 22 с «невозможно создать одно без другого, но нельзя создать другое без одного», не совсем так, как работает EF.
Есть простой способ сделать это. В следующем примере для создания Customer сначала используется анонимный делегат (лямбда-выражение). Как только операция вернулась с сервера, делегатное / лямбда-выражение обрабатывает завершенное событие и позволяет сохранить адрес для этого клиента.
В этой модели предполагается, что между клиентом и адресом имеется 1 ко многим ... aka: 1 у клиента может быть много адресов. Поле Id Клиента является внешним ключом в адресе (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.
Примечание. Использование лямбда-выражений делает вещи немного проще, потому что у вас есть возможность доступа к переменным вне лямбда-выражений, если они объявлены в одном и том же методе. В противном случае для каждой операции вам нужно сохранить объекты в «State», если для достижения того, что вы хотите, требуется более одной операции: