由于主键约束,无法向 WCF DataService 提交新对象
Posted
技术标签:
【中文标题】由于主键约束,无法向 WCF DataService 提交新对象【英文标题】:Can't submit new object to WCF DataService because of Primary Key constraint 【发布时间】:2011-02-18 17:26:48 【问题描述】:我有一个使用 Guid 进行 PK 的 SQL 数据库,在插入时,它会生成一个 NewId()。我有一个指向该数据库的 EF 数据上下文设置,其主键设置为 Entity key:true、Setter:private 和 StoreGeneratedPattern:Identity,因为我希望 DB 管理键并且没有代码设置 PK 属性。
我有一个 OData (System.Web.Data.Services.DataService) 端点来访问这些数据(就像:Hanselman did。
我有另一个应用程序具有对此服务的服务引用。在尝试从此引用(即产品)创建新对象时,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”是只读的 属性,无法更新。请 确保该属性不是 存在于请求负载中。
有没有办法做到这一点,或者我可以做些什么来正确地进行此设置并且仍然让数据库生成密钥。
这里的设置与上面的产品示例相同。
【问题讨论】:
【参考方案1】:我最终做的是添加一个ChangeInterceptor
。这可行,但不是首选方式。
[ChangeInterceptor("Products")]
public void OnChangeApplications(Product product, UpdateOperations operations)
if (operations != UpdateOperations.Add) return;
if (product.ProductId == Guid.Empty)
product.ProductId = Guid.NewGuid();
【讨论】:
以上是关于由于主键约束,无法向 WCF DataService 提交新对象的主要内容,如果未能解决你的问题,请参考以下文章