none
Herança de Classe - Conversão especificada não é válida RRS feed

  • Pergunta

  • Olá,

    Tenho uma classe Colaborador, essa classe é abstrata. Tenho a classe ColaboradorFisico que é uma classe que herda de Colaborador.

    No ColaboradorFisico eu tenho o campo CPF.

    Minha tabela Colaborador tem a informação do CPF. Preciso verificar se existe um CPF cadastrado na tabela de colaborador antes de inserir. Para isso fiz este método:

    internal bool VerificarExisteCPF(string cpf)
    {
        return !colaboradores.OfType<ColaboradorFisico>().Any(c => c.CPF == cpf);
    }

    Entretanto ele diz que a Conversão especificada não é válida.

    Como posso fazer para buscar por campos de minha classe filha?

    Obrigado.

    domingo, 17 de outubro de 2010 13:41

Respostas

  • Adriano,

    Segue um modelo que irá lhe ajudar

    http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx

    var query = from p in ctx.GetTable<Person>().OfType<Employee>()
    
          select p;
    
     
    
    foreach (Person p in query)
    
    {
    
      // Do something with employees
    
    }

    • Marcado como Resposta Adriano Galesso segunda-feira, 18 de outubro de 2010 15:07
    segunda-feira, 18 de outubro de 2010 14:08

Todas as Respostas

  • Adriano,

    Você poderia postar exatamente a mensagem de erro completa que você está recebendo?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 18 de outubro de 2010 11:50
    Moderador
  • Bom dia André,

    O Table do Data Context encapsula o erro, mas é o "Specified cast is not valid". Da para ver pelo Result View.

    Esse é o Stack Trace:  
       at System.Data.SqlClient.SqlBuffer.get_Int32()
       at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
       at Read_Colaborador(ObjectMaterializer`1 )
       at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
       at System.Linq.SystemCore_EnumerableDebugView`1.get_Items() 

    É um problema do cão, pois não estou conseguindo realizar filtros com classes herdadas, por exemplo:

          var colaboradorF = from colab in colaboradores.OfType<ColaboradorFisico>()
                      where colab.TipoColaborador == TipoColaborador.Físico &&
                         colab.Nome.Contains(cFisico.Nome) || string.IsNullOrEmpty(cFisico.Nome) &&
                         colab.Sobrenome.Contains(cFisico.Sobrenome) || string.IsNullOrEmpty(cFisico.Sobrenome) &&
                         colab.CPF.Contains(cFisico.CPF) || string.IsNullOrEmpty(cFisico.CPF) &&
                         colab.Status == cFisico.Status || cFisico.Status == null
                      orderby colab.Nome
                      select colab;
    

    Ele da a mesma exception. "Specified cast is not valid", mas eu preciso do OfType<ColaboradorFisico> pois o CPF, sobrenome e outros dados estão nele. E preciso efetuar filtros neste campo.

    Obrigado!

    segunda-feira, 18 de outubro de 2010 13:13
  • Adriano,

    Segue um modelo que irá lhe ajudar

    http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx

    var query = from p in ctx.GetTable<Person>().OfType<Employee>()
    
          select p;
    
     
    
    foreach (Person p in query)
    
    {
    
      // Do something with employees
    
    }

    • Marcado como Resposta Adriano Galesso segunda-feira, 18 de outubro de 2010 15:07
    segunda-feira, 18 de outubro de 2010 14:08
  • Seilor,

    Passei por este Blog 100 vezes mas parace que só agora consegui notar a burrice que eu estava fazendo.

    A conversão inválida não eram nas minhas classes herdadas e sim no mapeamento do meu descriminador. Acontece que ele é um enumerador no C# e tipo smallint no banco de dados, o mapeamento estava assim:

    <Column Name="Tipo_Colaborador" Member="TipoColaborador" IsDiscriminator="true"/>
    

    Precisei apenas informar o tipo:

    <Column Name="Tipo_Colaborador" Member="TipoColaborador" IsDiscriminator="true" DbType="smallint"/>
    

    Agora sim está ok. Tô me ferrando com esses mapeamentos em XML.

    Obrigado pessoal


    Adriano Galesso Alves Blog: http://www.lixeiradodri.blogspot.com/ Twitter: @AdGalesso
    segunda-feira, 18 de outubro de 2010 15:07