Услуги RIA: Отношения Родитель-ребенок-сущность

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

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

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

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

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


person Daniel    schedule 19.02.2011    source источник


Ответы (2)


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

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

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

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

person seekingtheoptimal    schedule 05.11.2011