toList () System.InvalidCastException не было обработано кодом пользователя - PullRequest
0 голосов
/ 09 марта 2012

Я написал службу WCF, используя LINQ to SQL (используя следующую статью в codeporject ). Я сталкиваюсь с недопустимым исключением приведения, когда я вызываю метод .ToList () объекта после того, как я уже сделал вызов функции wcf того же сервиса для той же базы данных.

Исключение составляет:

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: 

Конкретная строка, с которой я сталкиваюсь, связана с методом ToList ()

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

При отладке возвращаемый устав выдает исключение. При просмотре значения cmd.ToList () в Quick Watch VS 2010 отображается исключение.

Теперь самое странное: нажатие кнопки «Переоценка» пару раз меняет исключение на требуемый список объектов в «Быстрый просмотр». На самом деле я должен нажать «Пересмотреть» как минимум три раза.

Я сгенерировал клиента с помощью инструмента svcutil после последних изменений в службе / базе данных.

Я вызываю метод, используя следующий код из службы Windows:

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

Вот модель Command в интерфейсе сервиса 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; }
    }

Важно то, что файл моей базы данных находится в папке AppData службы WCF. Я использую только один экземпляр объекта db (см. 1-й блок кода выше) в моей службе wcf, и мне интересно, может ли это быть причиной проблемы ???

Кроме того, я вызвал несколько похожих методов этого же сервиса wcf из настольного приложения, но я не сталкивался с такой проблемой.

Пожалуйста, помогите. если требуется больше подробностей, пожалуйста, укажите это так. Единственное, что может прийти на ум, - это то, что, возможно, база данных используется, и когда служба устанавливает другое соединение с базой данных, происходит сбой. и повторная попытка несколько раз с помощью кнопки «Быстрый просмотр> Переоценка» отображает необходимые значения в окне просмотра без каких-либо ошибок.

Пожалуйста, помогите в этом. Быстрые ответы высоко ценятся.

Спасибо.

Steve

1 Ответ

1 голос
/ 10 марта 2012

Неважно, ребята. Я решил это.

Для тех, кто получает недопустимое исключение приведения, вот решение. Ошибка возникает только тогда, когда фактическая модель класса отличается от базы данных.

Если вы создали модель класса вручную, закодировав ее, вы должны сопоставить имя каждого столбца таблицы с соответствующим классом. LINQ to sql обнаруживает ошибку, когда не может преобразовать тип базы данных в тип .Net и выдает недопустимое исключение приведения.

Таким образом, в большинстве случаев устранение ошибки вручную в классе модели или восстановление класса решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...