none
Atualizar Campo Foreign Key / Linq To Entities RRS feed

  • Pergunta

  • Boa Tarde,
    Possuo em um DATABASE SQL SERVER uma tabela chamada DESPESA e outra SITUACAO, elas estão relacionadas, onde o ID_SITUACAO é FK na TABELA DESPESA, até ai OK.

    A questão é que preciso criar um método que usando o LINQ atualize apenas este campo na tabela DESPESA.

    Meu código hoje está assim

    Public Function AtualizarSituacaoDespesa(ByVal despesa As Entity.DESPESA, ByVal situacaoId As Long) As Boolean Implements IDespesaDao.AtualizarSituacaoDespesa
              

    'Contexto representa as entidades geradas pelo Entity Framework
    Dim contexto As MeuEntities = MeuDataContext.CurrentContext Dim key As EntityKey = contexto.CreateEntityKey("DESPESA", despesa) Dim _despesaOriginal As Object If contexto.TryGetObjectByKey(key, _despesaOriginal) Then despesa = _despesaOriginal despesa.SITUACAO = New SITUACAO() despesa.SITUACAO.ID = situacaoId contexto.ApplyPropertyChanges( _ key.EntitySetName, _ despesa) End If Try Return contexto.SaveChanges() > 0 Catch ex As Exception End Try End Function
    Reparem que recupero a despesa original atribuo a despesa para depois setar a situação, faço isso pois a despesa passada como parâmetro possui apenas
    os valores do ID e da SITUACAO original, e como os demais campos estavam nulos se chamasse o SaveChanges direto daria erro nos campos no banco que não podem ser nulos.

    A questão é: ao chamar o SaveChanges, recebo uma mensagem informando que o campo DESCRICAO na tabela SITUACAO não pode ser nulo. parece que de alguma forma ele está tentando inserir um registro na tabela SITUACAO em vez de atualizar o campo ID_SITUACAO na tabela despesa.

    Alguém pode me ajudar?
    Desde já agradeço.
    Se o post foi útil marque como resposta. - Advanced Web Application - MCP
    sexta-feira, 22 de maio de 2009 13:51

Todas as Respostas

  • Marcus,

    Tem como vc postar a config (dbml) destas tabelas ?

    Desculpe, mas qual era sua intenção com este código :

    If contexto.TryGetObjectByKey(key, _despesaOriginal) Then
    
                    despesa = _despesaOriginal
    
                    despesa.SITUACAO = New SITUACAO()
                    despesa.SITUACAO.ID = situacaoId
    
    
    
                    contexto.ApplyPropertyChanges( _
                        key.EntitySetName, _
                        despesa)
    
                End If
    


    Mais detalhes veja:
    http://blogs.msdn.com/efdesign/archive/2008/10/27/foreign-keys-in-the-conceptual-and-object-models.aspx
    Nelson Borges - http://nelsonborgesjr.spaces.live.com/blog/
    domingo, 24 de maio de 2009 18:31
  • Obrigado Nelson,


    Descobri aonde estava errando, na verdade estava errando ao tentar setar as propriedades do objeto manualmente, o certo era fazer isso usando o contexto do banco de dados, ou seja preenchendo o valor dos objectos através de uma consulta ao banco em evz de setar manualmente as propriedades.

    Por um lado é ruim, pois necessita mais uma ida desnecessária ao banco


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP
    quarta-feira, 27 de maio de 2009 01:23
  • Olá,
    Estou com o mesmo  problema ao setar a chave estrangeira.  Tenho um objeto cliente que possui contatos, após gravar o cliente preciso gravar os contatos do cliente.
     using (linqEntities context = new linqEntities())
                {
                    cliente c = new cliente();
                    c.clnRazaoSocial = "Empresa 1";
                    context.AddObject("cliente", c);                
                    context.SaveChanges();
    
                    contato t = new contato();
                    t.cliente = new cliente(); ---> aqui não deve estar correto,
     pois após a execução ele cria dois registros cliente e um contato,
    sendo que o contato aponta para o segundo registro cliente. t.cliente.clnId = c.clnId; t.cttNome = "Contato 1"; context.AddObject("contato",t); context.SaveChanges(); }
    Como seto a chave estrangeira?
    Grato.
    Maia.
    segunda-feira, 15 de junho de 2009 23:49