我有一个使用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
答案 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();
}
}