【问题标题】:Silverlight + RIA: problem editing entitySilverlight + RIA:问题编辑实体
【发布时间】:2011-06-03 15:46:21
【问题描述】:

我有一个使用 EntityFramework 作为数据层的 Silverlight 4 应用程序。

有两个实体:客户和产品。当我从数据库中获取客户时,也会读取相关产品,因为我在客户的元数据中添加了相关的“包含”属性并在获取查询中调用 Include 方法:

public IQueryable<customer> GetCustomerSetById(int customerId)
{
    return this.ObjectContext.CustomerSet
        .Include(o => o.Products)
        .Where(o => o.Id = customerId);
}

当我更改客户产品中的任何属性时出现此异常的问题:

这个类型的EntitySet 'MyApp.Web.Models.Product' 没有 支持“编辑”操作。

但如果我直接阅读客户产品,一切都会奏效,例如不是通过客户实体 (CustomerContext) ,而是通过产品一 (ProductContext)。

产品实体中还有 IsReadOnly=true 属性。

更新:

我拥有所有 CUD 操作,并且还用相关的插入、更新和删除属性标记了所有这些操作。否则它根本不起作用,但它在某些情况下对我有用,就像我上面写的那样。

有什么想法吗?

【问题讨论】:

  • 啊 - 错过了它在某些情况下工作的那一点。
  • 这是 RIA+EF 的真正问题,因此我们将所有实体保存在一个域服务中,因为在客户端很难处理通过导航属性相关的多个实体。想一想实际上并没有什么区别,我们使用 EF T4 模板在一个类中生成所有域服务操作。并且我们生成了部分方法来拦截领域服务方法的逻辑。
  • @Akash Kava:看起来您对 RIA 和多个域服务文件的看法是正确的。如果我为所有实体创建一个域服务 - 它可以工作。因此,请发表您的评论作为答案-我会接受。谢谢。

标签: silverlight entity-framework ria


【解决方案1】:

这是 RIA+EF 的真正问题,因此我们将所有实体保存在一个域服务中,因为在客户端很难处理通过导航属性相关的多个实体。想一想实际上并没有什么区别,我们使用 EF T4 模板在一个类中生成所有域服务操作。并且我们生成了部分方法来拦截领域服务方法的逻辑。

【讨论】:

    【解决方案2】:

    听起来您需要确保您的域服务中有更新操作。它看起来像这样:

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

    【讨论】:

      【解决方案3】:

      RIA Services EntitySet does not support 'Edit' operation

      由于上述解决方案似乎没有帮助尝试使用它:

      Domain Service Wizard

      此向导应查看您的实体,并生成适当的 CRUD 操作。 如果您随后无法更新您的实体,那么您将遇到不同的问题。

      【讨论】:

      • 我以前看过这个问题,但没有发现它有帮助。我的 CustomerService 已经拥有具有相关属性的客户 CUD 方法。还是我错过了什么?
      • 不,我仍然没有调用更新,因为我在设置产品属性时崩溃了:customer.Products.First().Description = "something";调用更新将是下一个问题。
      • 我向我的 anwser 添加了一个不同的建议,请尝试一下,因为听起来您所做的一切都是正确的,但很难验证。
      • 我在创建域服务时使用了此向导(包括“启用编辑”复选框)。
      【解决方案4】:

      您是否尝试过将“包含”移到末尾?

      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");
      

      【讨论】:

      • 不要认为这是问题所在,而且似乎 IQuerible 没有 Include 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多