我有一个带有EntityFramework的Silverlight 4应用程序作为数据层。
有两个实体:客户和产品。当我从数据库获取客户时,也会读取相关产品,因为我在客户的元数据中添加了相关的“包含”属性,并在获取查询中调用了包含方法:
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操作,并且还使用相关的Insert,Update和Delete属性标记了所有这些操作。否则它根本不起作用,但在某些情况下它对我有用,如上所述。
有什么想法吗?
答案 0 :(得分:2)
这是RIA + EF的真正问题,因此我们将所有实体保留在一个域服务中,因为在客户端,很难处理通过导航属性相关的多个实体。想想它实际上没什么区别,我们使用EF T4模板在一个类中生成所有域服务操作。我们生成了部分方法来拦截域服务方法的逻辑。
答案 1 :(得分:0)
听起来您需要确保域服务中有更新操作。它看起来像这样:
public void UpdateProduct(Product product)
{
ObjectContext.Products.AttachAsModified(product, ChangeSet.GetOriginal(product));
}
答案 2 :(得分:0)
RIA Services EntitySet does not support 'Edit' operation
由于上述解决方案似乎没有帮助尝试使用它:
此向导应查看您的实体,并生成相应的CRUD操作。 如果您无法更新实体,则会遇到其他问题。
答案 3 :(得分:0)
您是否尝试过将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");