views:

68

answers:

1

I've got a SQL database that uses Guid's for PK's and upon insert, it generates a NewId(). I have an EF data context setup pointing to that database with the primary keys setup with the Entity key:true, Setter:private and StoreGeneratedPattern:Identity because I want the DB to manage the keys and not have code set the PK property.

I have an OData (System.Web.Data.Services.DataService) endpoint to access this data (just like: Hanselman did.

I have another app that has a service reference to this service. Upon trying to create a new object from this reference (i.e. Product), the ProductId Primary Key is being defaulted to Guid.Empty when doing

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

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

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

When debugging, I look at the Product.ProductId property and it's set to Guid.Empty. When called SaveChanges, I do not want the ProductId field to be sent to the service. The response I get is:

Error processing request stream. Property 'ProductId' is a read-only property and cannot be updated. Please make sure that this property is not present in the request payload.

Is there a way to do this or what can I do to get this setup correctly and still have the DB generated the keys.

Here is the same setup as the Product example above. alt text

A: 

What I ended up doing was adding a ChangeInterceptor. This works but its not the preferred way of doing it.

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

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