1

我有一个使用 Guid 进行 PK 的 SQL 数据库,在插入时,它会生成一个 NewId()。我有一个指向该数据库的 EF 数据上下文设置,主键设置为 Entity key:true、Setter:private 和 StoreGeneratedPattern:Identity,因为我希望 DB 管理键并且没有代码设置 PK 属性。

我有一个 OData (System.Web.Data.Services.DataService) 端点来访问这些数据(就像:Hanselman 所做的那样。

我有另一个应用程序具有对此服务的服务引用。在尝试从此引用(即产品)创建新对象时,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”是只读属性,无法更新。请确保请求有效负载中不存在此属性。

有没有办法做到这一点,或者我能做些什么来正确地进行这个设置并且仍然让数据库生成密钥。

这是与上面的产品示例相同的设置。 替代文字

4

1 回答 1

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();
    }
}
于 2010-05-14T14:59:03.757 回答