Я написал службу 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