Pergunta

Eu escrevi um serviço WCF usando LINQ to SQL (usando o seguinte artigo em codeporject).Estou enfrentando uma exceção de conversão inválida quando invoco o método .ToList() de um objeto depois de já ter feito uma chamada de função WCF do mesmo serviço no mesmo banco de dados.

A exceção é:

System.InvalidCastException was unhandled by user code
  Message=Specified cast is not valid.
  Source=System.Data
  StackTrace:
       at System.Data.SqlClient.SqlBuffer.get_Int64()
       at System.Data.SqlClient.SqlDataReader.GetInt64(Int32 i)
       at Read_Command(ObjectMaterializer`1 )
       at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       at SystemsManager.ACS.GetCommands(Int64 agentId) in E:\Projects\SystemsManager\AgentControlService\ACS.svc.cs:line 167
       at SyncInvokeGetCommands(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
  InnerException: 

A linha específica que estou tendo problema é com o método ToList()

 public List<Command> GetCommands(long agentId)
        {
            var cmd = from command in db.Command where (command.AgentId == agentId) select command;
            return cmd.ToList();
        }

Ao depurar, a instrução return lança uma exceção.Ao visualizar o valor de cmd.ToList() no Quick Watch do VS 2010, a exceção é mostrada.

Agora o mais estranho é:Pressionar o botão "Reavaliar" algumas vezes altera a exceção para a lista de objetos necessários na Observação rápida.Na verdade, tenho que pressionar "Reavaliar" pelo menos três vezes.

Eu gerei o cliente usando a ferramenta svcutil após minhas alterações mais recentes no serviço/banco de dados.

Estou chamando o método usando o seguinte código de um serviço do Windows:

var agent = client.GetAgentByIpAddress(myIPAddress);
                client.Close();
                if (agent != null)
                {
                    if (agent.AgentId != -1)
                    {
                        client = new ACSClient();
                        var command = client.GetCommands(agent.AgentId);
                        .....

Aqui está o modelo de Comando na interface do serviço WCF.

[DataContract]
    [Table(Name = "Command")]
    public class Command
    {
        [DataMember, Column(IsPrimaryKey = true, Name = "Command_Id", AutoSync = AutoSync.OnInsert, IsDbGenerated = true, DbType = "Bigint NOT null identity")]
        public long CommandId { get; set; }

        [DataMember, Column(Name = "Agent_Id")]
        public long AgentId { get; set; }

        [DataMember, Column(Name = "Name")]
        public string CommandName { get; set; }

        [DataMember, Column(Name = "Paramters")]
        public string CommandParamters { get; set; }

        [DataMember, Column(Name = "Is_Fetched")]
        public bool IsFectched { get; set; }

        [DataMember, Column(Name = "Status")]
        public long Status { get; set; }

        [DataMember, Column(Name = "Response")]
        public string Response { get; set; }

        [DataMember, Column(Name = "Created")]
        public DateTime Created { get; set; }

        [DataMember, Column(Name = "Last_Modified")]
        public DateTime LastModified { get; set; }

        [DataMember, Column(Name = "Is_Enabled")]
        public bool IsEnabled { get; set; }
    }

O importante é:Meu arquivo de banco de dados está localizado na pasta AppData do serviço WCF.Estou usando apenas uma instância de banco de dados objeto (consulte o primeiro bloco de código acima) em todo o meu serviço WCF e estou me perguntando se isso pode ser a causa do problema ???

Além disso, chamei alguns métodos semelhantes desse mesmo serviço WCF a partir de um aplicativo de desktop, mas não enfrentei nenhum problema desse tipo.

Por favor ajude.se forem necessários mais detalhes, indique-os.A única coisa que pode vir à mente é que talvez o banco de dados esteja em uso e quando outra conexão for feita ao banco de dados pelo serviço, ele falhará.e tentar novamente algumas vezes usando o botão Quick Watch > Reavaliar exibe os valores necessários na janela de observação sem gerar nenhum erro.

Por favor, ajude neste.Respostas rápidas são muito apreciadas.

Obrigado.

Steve

Foi útil?

Solução

Não importa, pessoal.Eu resolvi isso.

Para qualquer pessoa que esteja recebendo uma exceção de conversão inválida, aqui está a solução.O erro ocorre apenas quando o modelo de classe real é diferente do banco de dados.

Se você criou o modelo de classe codificando-o manualmente, deverá corresponder o nome de cada coluna da tabela à sua classe correspondente. LINQ to sql encontra erro quando não consegue converter um tipo de banco de dados para o tipo .Net e lança uma exceção de conversão inválida.

Portanto, na maioria dos casos, corrigir o erro manualmente na classe do modelo ou regenerar a classe resolverá o problema.

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