Silverlight + RIA: задача редактирования сущности


У меня есть приложение Silverlight 4 с EntityFramework в качестве слоя данных.

Есть две сущности: потребитель и продукты. Когда я получаю клиента из базы данных, связанные продукты также считываются, так как я добавил связанный атрибут "Include" в метаданные клиента и вызываю метод Include в запросе get:
public IQueryable<customer> GetCustomerSetById(int customerId)
{
    return this.ObjectContext.CustomerSet
        .Include(o => o.Products)
        .Where(o => o.Id = customerId);
}

Проблема в том, что когда я изменяю какое-либо свойство в продукте клиента, я получаю это исключение:

Этот EntitySet типа - Мой мальчик.Сеть.Модели.Продукт" не делает поддержите операцию "редактировать".

Но все работает, если я читаю продукты клиента напрямую, например, не через сущность клиента (CustomerContext), а через продукт один (ProductContext).

Также существует свойство IsReadOnly=true в сущности продукта.

Обновление:

У меня есть все операции CUD, а также все они помечены соответствующими атрибутами Insert, Update и Delete. В противном случае он не работал бы вообще, но он работает для меня в некоторых случаях, как я написал выше.

Есть идеи?

4 3

4 ответа:

Это реальная проблема с RIA+EF, поэтому мы сохраняем все наши сущности в одном доменном сервисе, потому что на стороне клиента трудно иметь дело с несколькими сущностями, связанными через свойства навигации. Подумайте минутку, на самом деле это не имеет никакого значения, и мы используем шаблон EF T4 для генерации всех операций доменной службы в одном классе. И мы создали частичные методы для перехвата логики методов доменной службы.

Похоже, вам нужно убедиться, что у вас есть операция обновления в вашей доменной службе. Это будет выглядеть примерно так:

public void UpdateProduct(Product product)
{
    ObjectContext.Products.AttachAsModified(product, ChangeSet.GetOriginal(product));
}

EntitySet служб RIA не поддерживает операцию 'Edit'

Поскольку вышеупомянутые решения, по-видимому, не помогают, попробуйте использовать это:

Мастер Доменных Служб

Этот мастер должен посмотреть на вашу сущность и сгенерировать соответствующие операции CRUD. Если вы не можете обновить свои сущности, у вас другая проблема.

Вы пробовали переместить Include в конец?

Return this.ObjectContext.CustomerSet
        .Include(o => o.Products)
        .Where(o => o.Id = customerId);

Может быть:

Return (from o in this.ObjectContext.CustomerSet
        where o.Id = customerId
        select o).Include("Products");