由于主键约束,无法将新对象提交到WCF DataService

时间:2010-05-12 16:17:30

标签: wcf entity-framework odata wcf-data-services

我有一个使用Guid用于PK的SQL数据库,插入后,它会生成一个NewId()。我有一个EF数据上下文设置指向该数据库,主键设置为Entity键:true,Setter:private和StoreGeneratedPattern:Identity因为我希望DB管理密钥而不是代码设置PK属性。

我有一个OData(System.Web.Data.Services.DataService)端点来访问这些数据(就像:Hanselman did

我有另一个应用程序,它具有对此服务的服务引用。在尝试从此引用(即Product)创建新对象时,ProductId主键在执行时默认为Guid.Empty

var serviceEntities = new ServiceEntities(serviceUri); //OData endpoint

var product = new Product();
product.Name = "New Product";

serviceEntities.AddToProducts(product);
serviceEntities.SaveChanges(); // error happens here

调试时,我查看Product.ProductId属性,并将其设置为Guid.Empty。当调用SaveChanges时,我不希望将ProductId字段发送到服务。我得到的回应是:

  

处理请求流时出错。   属性'ProductId'是只读的   属性,无法更新。请   确保此属性不是   存在于请求有效载荷中。

有没有办法做到这一点,或者我该怎么做才能正确设置此设置并且仍然让数据库生成密钥。

以下是与上面的产品示例相同的设置。 alt text http://i42.tinypic.com/157g593.png

1 个答案:

答案 0 :(得分:0)

我最终做的是添加ChangeInterceptor。这有效,但它不是首选方式。

[ChangeInterceptor("Products")]
public void OnChangeApplications(Product product, UpdateOperations operations)
{
    if (operations != UpdateOperations.Add) return;

    if (product.ProductId == Guid.Empty)
    {
        product.ProductId = Guid.NewGuid();
    }
}