Não é possível enviar um novo objeto para o WCF DataService por causa da restrição de chave primária
-
26-09-2019 - |
Pergunta
Eu tenho um banco de dados SQL que usa o GUID para PK's e, após o Insert, ele gera um newid (). Eu tenho uma configuração de contexto de dados EF apontando para esse banco de dados com a configuração das chaves primárias com a chave da entidade: true, Setter: private e StoreGeneratedPattern: Identity porque quero que o banco de dados gerencie as chaves e não tenha o código definido na propriedade PK.
Eu tenho um ponto de extremidade Odata (System.Web.Data.Services.Dataservice) para acessar esses dados (assim como: Hanselman fez.
Eu tenho outro aplicativo que tem uma referência de serviço a este serviço. Ao tentar criar um novo objeto a partir desta referência (por exemplo, o produto), a chave primária do ProductID está sendo padrão para guiar.Empty ao fazer
var serviceEntities = new ServiceEntities(serviceUri); //OData endpoint
var product = new Product();
product.Name = "New Product";
serviceEntities.AddToProducts(product);
serviceEntities.SaveChanges(); // error happens here
Ao depurar, olho para a propriedade PRODUTO.PRODUCTID e está definido como Guid.Empty. Quando chamado SaveChanges, não quero que o campo do ProductID seja enviado para o serviço. A resposta que recebi é:
PROCESSÃO DE ERRO PRONTAGEM DE SOLGA. Propriedade 'ProductId' é uma propriedade somente leitura e não pode ser atualizada. Certifique -se de que esta propriedade não esteja presente na carga útil da solicitação.
Existe uma maneira de fazer isso ou o que posso fazer para obter essa configuração corretamente e ainda ter o banco de dados gerado as chaves.
Solução
O que acabei fazendo foi adicionar um ChangeInterceptor
. Isso funciona, mas não é a maneira preferida de fazê -lo.
[ChangeInterceptor("Products")]
public void OnChangeApplications(Product product, UpdateOperations operations)
{
if (operations != UpdateOperations.Add) return;
if (product.ProductId == Guid.Empty)
{
product.ProductId = Guid.NewGuid();
}
}