ENTITY COM STORED PROCEDURE

ONBASS 01/08/2012 07:41:55
#406981
Caros bom dia,

Imaginem a seguinte estrutura:

=> Alunos (ID, Nome, Sala)
=> Telefones (ID, FK_Aluno, Telefone1, Telefone2)

Fiz a Stored de inserção e tal, porém lá no Entity quando vai fazer a chamada, como eu lanço o FK_Aluno se eu nao consigo capturar a ID do aluno pela Classe, no caso de Stored. Na verdade eu até conseguiria mas no momento da inserção, por ser em stored, a ID aluno nao fica visivel, ou ativa naquele momento.

Bom, eu fiz uma lambda com o MAX para retornar, mas achei meio gambiarra. Como eu pegaria tal ID no ato da inserção?
Em resumo seria, como pegar o ID do Aluno para lançar em endereços..

Aproveitando, qual seria a melhor opção para relatorios em Asp.net?
Grato.
KERPLUNK 01/08/2012 08:12:01
#406984
Resposta escolhida
Você precisa da id que o aluno vai ter antes de inserir, isso?
ONBASS 01/08/2012 09:51:39
#406990
exato KERP.
KERPLUNK 01/08/2012 10:43:39
#406995
Bem, não existe uma maneira de se buscar o próximo Id antes de salvar o registro, essa é uma arquitetura errada. Você deve primeiro inserir o aluno depois inserir os telefones. São os telefones que são dependentes do aluno e não o contrário. O que você pode fazer, é inserir o aluno em um [Ô]estado nulo[Ô], inserir os telefones e depois atualizar o registro do aluno com os dados. Mas isso é ainda mais trabalhoso do que seguir o fluxo correto que é inserir o registro pai antes dos filhos...
ONBASS 01/08/2012 10:59:01
#406999
Rpz, mas do jeito q to fazendo eu consigo salvar o ID correto no aluno na tabela endereço.

Se eu faço um lambda pegando o ID maximo do aluno, e jogo em endereço funciona normal.

Só que to achando isso uma gambiarra.

Como disse, to usando stored, dae quando a stored lança o aluno ja fica disponivel seu id, com o lambda lanço no enbdereço.

Sem falar q to lançando os dados na mesma transação.
KERPLUNK 01/08/2012 11:16:39
#407000
Então, você tem uma tabela aluno e uma tabela endereços, certo? Você pode ter múltiplos endereços por aluno, certo? O correto para a sua situação, é o famoso [Ô]De-Para[Ô], uma tabela intermediária que liga as duas, ou seja, a tabela endereço, não liga mais direto com o aluno, mas sim com essa tabela intermediária. Essa tabela, vai ter basicamente dois campos, IdAluno e IdEndereco. Assim, você pode inserir endereços à vontade, sem ter necessariamente o aluno cadastrado, depois pode criar a ligação de um com outro inserindo um registro nessa tabela intermediária.
ONBASS 01/08/2012 11:20:21
#407001
ixi deu nó aqui.
como vou criar endereços à vontade sem saber de quem são? nao entendi direito, poderia exemplificar?
KERPLUNK 01/08/2012 11:59:46
#407006
Você tem a tabela de alunos
Você tem a tabela de endereços
Na tabela de alunos, tem dados do aluno e nada mais
Na tabela de endereços, tem dados de endereço e nada mais

Você tem também uma outra tabela(vamos chamar de RUAlunoEndereco), que vai ter os campos IdAluno e IdEndereço

Como endereço, não tem mais PK com a tabela aluno, você pode inserir nela qualquer endereço. E o mesmo na tabela de alunos.

Quando você quer criar um vínculo entre aluno e endereço, você adiciona um registro na tabela RUAlunoEndereco passando o código do aluno e também do endereço. Então, para saber os endereços que o aluno tem vinculados, você consulta a tabela RUAlunoEndereco passando para ela o id do Aluno e você terá todos os Id[ô]s de endereços associados ao aluno. O inverso também pode ser feito, você passar para RUAlunoEndereco um Id de endereço e você terá todos os alunos que estão associados à aquele endereço.

Essa associação se chama [Ô]N para N[Ô], ou muitos para muitos. Com ela você pode:
- Ter vários endereços para o mesmo aluno(imagine um filho de pais separados que hora está com um e hora com outro, ou ainda com a avó, tio...)
- Ter vários alunos para um mesmo endereço(imagine irmãos que moram todos juntos)
- Ter endereços que não estão associados à nenhum aluno
- Ter alunos sem nenhum endereço
- Criar ainda uma outra tabela, digamos RUFornecedorEndereco(e ter todas as vantagens acima para fornecedores)
ONBASS 01/08/2012 12:15:32
#407009
Pelo q entendi, vou ter q fazer 3 inserts entao na mesma transação.

1a. pegar o id do aluno (q pressupoe um insert);
2a. pegar id do endereço(iden); e
3a. lançar ambos os ids na 3a tabela.
KERPLUNK 01/08/2012 12:22:21
#407010
Isso mesmo.
ONBASS 01/08/2012 12:39:35
#407015
rpz boa ideia, mas vc nao acha como to fazendo menos [Ô]custoso[Ô] ao sistema?
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas