Pergunta

Essa tem que ser uma pergunta frequente, mas ainda não, parece. Estou usando o LINQ para SQL para um aplicativo que permita uma variedade de alterações de dados no meu modelo na memória, e as alterações serão colocadas em uma fila para processamento assínconoso. Então, ainda não estou preocupado com as atualizações (ainda). Alterações em várias partes dos dados podem ser feitas através de pop -ups modais na página da web. Alguns são baseados em grade, outros são apenas atributos. Estou enfrentando um problema com mudanças que não sobrevivem aos ciclos de postback. Obviamente, não quero persistir nada no banco de dados até que todas as alterações sejam feitas e o usuário envie a página.

A rota que escolhi até agora é:

  • Eu desativou o carregamento diferido
  • Eu crio uma classe parcial [serializável] para meu objeto raiz
  • Coloquei a coisa na sessão e a recupero no evento Onload

Isso parece funcionar em princípio. No entanto, quando tento atualizar algumas das propriedades das crianças depois de recuperar o objeto da sessão

p.PhysicianSpecialties[0].physician_specialty_code = 
    ddlSpecialty.SelectedItem.Value;

Eu recebo este erro:

Operation is not valid due to the current state of the object.

O erro é causado por esse método chamado no método do Setter Linq gerado:

this.SendPropertyChanging();

Outras propriedades são atualizadas muito bem:

p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();

Isso não causa um erro.

Minhas perguntas: Estou fundamentalmente na faixa errada? Existe um jeito melhor de fazer isso? O que causa o erro?

ATUALIZAÇÃO: A exceção é 'System.data.linq.foreignKeyReferencealReadyHasValueException'. Eu penso Estou em algo, mas ainda não conheço a solução.

Foi útil?

Solução

Recebi a solução do MSDN. A questão é e é explicada melhor neste tópico do que posso fazer isso, que não se pode mudar uma associação unilateralmente, mas precisa fazê -lo nas duas extremidades, atribuindo um novo objeto infantil, não apenas alterando o ID:

P.PhysiciansPecialties [0] .PhysiciansPialtyLookup = DB.PhysiciansPialtyLookups.single (c => (c.Physician_Specialty_code == ddlSpecialty.SelectedItem.value);

Outras dicas

E como se faz isso se estiver usando a ligação de dados? Eu tenho uma lista suspensa em uma visualização de grade de dados que começou a lançar esse erro quando eu altero o valor suspenso. Isso me faz pensar que tenho que excluir a associação ou não usar a ligação de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top