Не удается отправить новый объект в WCF DataService из-за ограничения первичного ключа - PullRequest
1 голос
/ 12 мая 2010

У меня есть база данных SQL, которая использует Guid для PK и после вставки генерирует NewId (). У меня есть настройка контекста данных EF, указывающая на эту базу данных с настройкой первичных ключей с ключом Entity: true, Setter: private и StoreGeneratedPattern: Identity, потому что я хочу, чтобы БД управляла ключами, а код не задавал свойство PK.

У меня есть конечная точка OData (System.Web.Data.Services.DataService) для доступа к этим данным (например, Hanselman сделал .

У меня есть другое приложение, в котором есть ссылка на эту услугу. При попытке создать новый объект из этой ссылки (т. Е. 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 доступно только для чтения свойство и не может быть обновлено. пожалуйста убедитесь, что это свойство не присутствует в запросе полезной нагрузки.

Есть ли способ сделать это или что я могу сделать, чтобы получить эту настройку правильно и при этом БД генерировала ключи.

Здесь те же настройки, что и в примере продукта выше. альтернативный текст http://i42.tinypic.com/157g593.png

1 Ответ

0 голосов
/ 14 мая 2010

В итоге я добавил ChangeInterceptor. Это работает, но это не самый предпочтительный способ сделать это.

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

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