Não é possível enviar um novo objeto para o WCF DataService por causa da restrição de chave primária

StackOverflow https://stackoverflow.com/questions/2820706

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.

Aqui está a mesma configuração do exemplo do produto acima.alt text

Foi útil?

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();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top