WCF服务返回LINQ to SQL数据时WinForm客户端接收值为null问题求助
核心原因
LINQ to SQL 生成的实体类默认不满足 WCF 序列化要求,同时默认开启的延迟加载会生成动态代理类,序列化时会丢失字段数据,或触发序列化异常被WCF静默处理,最终客户端拿到所有字段为null的结果。
解决方案按优先级尝试:
- 关闭数据上下文的延迟加载与对象跟踪
修改服务端的GetAllTradings方法,初始化上下文后关闭相关配置,避免生成代理类:
public List<Trades> GetAllTradings() { context = new DCStockTradingDataContext(); // 新增两行配置 context.DeferredLoadingEnabled = false; context.ObjectTrackingEnabled = false; List<Trades> tradings = (from t in context.Trades select t).ToList(); return tradings; }
开启DBML的单向序列化支持
打开你的LINQ to SQL对应的.dbml设计文件,在设计界面空白处右键点击「属性」,找到「序列化模式」选项,将值改为「单向」,保存后DBML会自动重新生成实体类,所有实体和字段都会自动添加[DataContract]、[DataMember]标记,适配WCF的序列化规则。手动创建DTO传输对象(最稳妥方案)
如果上述方案仍有问题,避免直接返回LINQ to SQL生成的实体类,自定义数据传输对象:
- 服务端新增
TradesDto类,标记序列化特性,仅保留需要对外暴露的字段:
[DataContract] public class TradesDto { [DataMember] public int Id { get; set; } [DataMember] public string StockName { get; set; } // 其他你需要返回的字段按上面格式添加 }
- 修改查询逻辑,映射实体到DTO再返回:
public List<TradesDto> GetAllTradings() { context = new DCStockTradingDataContext(); context.DeferredLoadingEnabled = false; context.ObjectTrackingEnabled = false; List<TradesDto> tradings = (from t in context.Trades select new TradesDto { Id = t.Id, StockName = t.StockName, // 对应字段赋值 }).ToList(); return tradings; }
- 重新更新客户端的服务引用,使用
TradesDto接收数据即可。
内容的提问来源于stack exchange,提问作者user13200394
相关产品推荐
相关产品推荐

