我使用 LINQ to SQL 编写了一个 WCF 服务(使用codeporject 上的以下文章)。在我已经对同一个数据库进行了同一个服务的 wcf 函数调用之后,当我调用一个对象的 .ToList() 方法时,我面临着无效的强制转换异常。
例外是:
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();
}
调试时,返回语句抛出异常。在 VS 2010 的 Quick Watch 中查看 cmd.ToList() 的值时,出现异常。
现在最奇怪的是:按下“重新评估”按钮几次将异常更改为快速监视中所需的对象列表。事实上,我必须至少按三下“重新评估”。
在最近对服务/数据库进行更改后,我使用 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);
.....
这里是wcf服务接口中Command的模型。
[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; }
}
重要的是:我的数据库文件位于 WCF 服务的 AppData 文件夹中。我在整个 wcf 服务中只使用了一个db对象实例(请参阅上面的第一个代码块),我想知道这是否是问题的原因???
此外,我已经从桌面应用程序调用了这个非常相同的 wcf 服务的几个类似方法,但我没有遇到任何此类问题。
请帮忙。如果需要更多详细信息,请说明。唯一可以想到的可能是数据库正在使用中,并且当服务与数据库建立另一个连接时,它会失败。并使用“快速观察”>“重新评估”按钮重试几次,在观察窗口中显示所需的值,而不会引发任何错误。
请帮助解决这个问题。快速响应受到高度赞赏。
谢谢。
史蒂夫