criação entidade do lado do cliente com tabelas de códigos relacionados

votos
1

Eu estou na curva de aprendizagem até a trilha Silverlight. Eu sou um desenvolvedor data-centric então, naturalmente, pegou o cliente ADO.NET Data Services ao longo do caminho. Eu estou coçar a cabeça sobre um cenário do mundo real e não consigo encontrar qualquer ajuda na documentação, blogs etc.

Eu tenho uma entidade Tutor complexo com conjuntos de entidades afins para endereços, phoneNumbers e EmailAddresses. Eu também tenho um par de outros conjuntos como Sujeitos e Certificações. Junto com tudo isso vem chaves estrangeiras para procurar tabelas para coisas como StatusCodes, AddressTypes (como Início, Negócios etc), EmailTypes e assim por diante. Tudo isso é encapsulado em um edmx no meu projeto Model. Aqui está uma parte da estrutura.

texto

No Silverlight Eu tenho um UserControl que é uma forma de entrada de dados para este tutor. Eu criei um DTO como objeto para a ligação de dados a controles de caixa de texto do cliente. Tudo está bem até que o usuário clicar em Salvar.

Salvar rotina cria e adiciona um tutor e Pessoa objetos e os adiciona à DataServiceContext e liga-los adequadamente. Onde eu estou correndo em problemas é que eu tenho para adicionar uma entidade relacionada que já está armazenado no contexto do banco de dados, tais como tabelas de códigos.

Por exemplo, a pessoa pode ter várias especialidades Assunto: Math Primária, Ciência etc. O TutorSubjectSet tem que se relacionam com 3 outros conjuntos: Objecto (por exemplo, da matemática.), SubjectLevel (por exemplo elementar.) E, em seguida, para o tutor. Meu DTO tem uma lista de itens Subject_With_Level combinados que apresenta um sub-conjunto de uma verdadeira seleção cartesiano (não existe tal coisa como elementar (escola) Cálculo pelo menos não onde eu fui para a escola :-). Essa lista mostra-se como uma lista caixa de seleção na interface do usuário. Assim, quando o usuário clicar em Salvar I pegar os itens verificados e eu tento fazer uma pesquisa sobre os valores Subject_With_Level.SubjectId e .SubjectLevelId combinadas contra as tabelas de códigos que têm esses valores.

Aqui é onde eu estou perdido. Em função do lado do servidor, eu seria OK porque eu posso fazer essas pesquisas in-line e obter a entidade imediatamente. Em uma situação assíncrono, como faço para obter as entidades relacionadas, enquanto eu estou ocupado montagem do gráfico pessoa? Fazendo uma chamada assíncrona no meio do Save processo não funciona.

Eu tentei várias coisas: Eu tentei fazer uma réplica ad-hoc da SubjectLevel usando o Subject_With_Level.SubjectLevelId e anexando que para o contexto da seguinte forma:




public static SubjectLevel MakeFakeSubjectLevelFor(TutoringEntities ctx, Subject_With_Level subjectAndLevel)
{
     var subjectLevel = new SubjectLevel()
                       {
                         SubjectLevelId = subjectAndLevel.SubjectLevelId,
                         Description = subjectAndLevel.SubjectLevel,
                         EffectiveDate = DateTime.Now,
                         EnteredBy = ,
                         EnteredDate = DateTime.Now,
                         Type = subjectAndLevel.SubjectLevel
                       }; 
    try { ctx.AttachTo(SubjectLevelSet, subjectLevel); }
    catch { //this tries to catch situations where the level (eg. Elementary) has already been created }
    return subjectLevel; 
} 



Essa abordagem funciona para situações em que não há duplicatas (. Ele também tem a vantagem de não ter que fazer uma chamada adicional) Por exemplo, em endereços, haverá apenas um endereço Home (eu tenho uma função semelhante: MakeAFakeAddressTypeFor ( )). Você vai notar que eu tenho um try / catch que captura o erro se os itens já está inserido no SubjectLevelSet. Se o item já foi inserido e eu bater esse erro, o subjectLevel retornado não está ligado ao contexto. Eu recebo um erro uma vez que o item não está sendo monitorado. No entanto, não posso recuperar uma subjectLevel existente sem a emissão de uma consulta assíncrona contra o SubjectLevelSet mesmo que seja em meu contexto local.

O que eu gostaria de fazer é:


var lev = ctx.SubjectLevelSet.Where(l => l.SubjectLevelId == subjectAndLevel.SubjectLevelId).FirstOrDefault();
if(lev == null )
  lev = Helpers.MakeFakeSubjectLevelFor(ctx, subjectAndLevel);

mas eu recebo: método especificado não é suportado que eu suponho que significa que tenho de fazer a consulta assíncrona por isso estou de volta à mesma situação.

Eu também tentou recuperar uma lista de SubjectLevels na delegado do evento Loaded. Dessa forma, eu teria o conjunto de SubjectElements na mão quando o botão Salvar é pressionado. Mesmo problema, eu tenho que emitir uma chamada assíncrona para fazer uma pesquisa, mesmo se eu tenho isso na mão. Tentei iteração através da lista para o que eu precisava, mas que me deu um erro dizendo que a entidade não estava sendo monitorado pelo contexto.

Então ... claramente eu não estou entendendo isso e estou fazendo errado, mas não consigo encontrar qualquer exemplos práticos que fazem este tipo de coisa. As how-to exemplos apenas feliz carregar primitivas para a entidade a ser armazenado. Não há exemplos que eu vi relacionados mostram entidades e como recuperá-los. Eu poderia fazê-lo valores inteiros de loja simples e apenas para o codeId e não relacioná-los via FK mas isso seria demasiado de um compromisso.

Obrigado por qualquer ajuda que você pode me fornecer.

Publicado 11/04/2009 em 11:58
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Realisticamente falando, eu acho que você sente que você tem que fazer a consulta assíncrona, porque leva muito tempo? É essa suposição correta? Se for esse o caso, você deve examinar o que você está tentando fazer com a própria consulta. Eu sempre acho que, se eu posso escrever o SQL para obter exatamente os dados que eu quero, então eu posso seguir em frente com a escrever o LINQ para ele (usando algo como LINQPad).

Além disso, você também pode fazer uma vista SQL que "achata" o gráfico complexo. Em seguida, no assistente de atualização EF certifique-se de selecionar a vista. Dessa forma, toda vez que você está construindo este costume complexo DTO você pode apenas emitir um lado do servidor onde cláusula em vez e preencher seus valores lá.

Se eu sou maneira fora no campo esquerdo deixe-me saber, eu tenho uma vasta experiência com a EF em cenários muito complexos objeto de dados de negócios e estou mais do que provável lendo sua situação incorretamente.

Acho que as pessoas na SO não estavam respondendo porque era demorado e eles estavam esperando por uma recompensa, apenas um palpite embora.

Respondeu 19/04/2009 em 03:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more