RIA Services: Entities Родитель Ребенок - PullRequest
2 голосов
/ 19 февраля 2011

В проекте, использующем RIA Services, у меня есть таблица Customer и таблица Address для хранения адреса каждого клиента.

На странице в Silverlight у меня есть данные Customer, и когда я раскрываюконтроль, адресные данные для этого клиента загружаются.

Когда я создаю нового клиента с его адресом, как мне сохранить оба отдельно?Сущность Address содержит CustomerId.Это обязательное поле.

Как я могу сохранить адрес, когда customerId не существует?И я также не могу сперва сохранить клиента, потому что ему нужен адрес.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2011

Если вы используете Entity Framework и правильно сопоставили ключи и внешние ключи, вам не нужно указывать ключ вручную, вы просто устанавливаете его с помощью свойства навигации (например, c.address = MyCreatedAddress или a. customer = MyCreatedCustomer) и любой объект, который вы сохраняете первым в контексте, который сохранит соответствующие объекты с помощью навигационной панели. свойства.

Одна вещь, которую вы должны иметь в виду, что если у вас есть отношение 1 к 1 вместо 1 ко многим, то первичные ключи должны быть одинаковыми для обеих таблиц в отображении (EF не даст вам другого выбора AFAIK)

(Довольно старый вопрос, но иногда он может кому-нибудь помочь)

0 голосов
/ 02 июня 2011

Позвольте мне кое-что прояснить. То, что у сущностей есть навигационные свойства, не означает, что вы не можете их создавать. Ваше восприятие, что у вас есть уловка 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», если для достижения того, что вы хотите, требуется более одной операции:

...