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

我有一个 OData (System.Web.Data.Services.DataService) 端点来访问此数据(就像: 汉塞尔曼做到了.

我有另一个应用程序具有对此服务的服务引用。尝试从此引用创建新对象时(即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

有帮助吗?

解决方案

我最终做的是添加一个 ChangeInterceptor. 。这可行,但不是首选方法。

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

    if (product.ProductId == Guid.Empty)
    {
        product.ProductId = Guid.NewGuid();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top