通过直接对代码举办调试,我们发明只要代码执行获取detailResult这一步的时候就会呈现上面的错误,那么到这里我们就可以揣度错误的处所就在这里了,所今后头我们的重点就是阐明这段代码。
2.2 定位发生错误的表名称这里就是操作前面的Include要领来查询到queryResult功效,然后操作queryResult.DegradedVehicleContractDetails来和Product以及VehicleInformation表来做inner join,这里你大概对_productRepository以及_vehicleInformationRepository这个局部变量不是十分熟悉,那么我们先来看看这个局部变量的界说以及初始化。
private readonly IRepository<Product> _productRepository; private readonly IRepository<VehicleInformation> _vehicleInformationRepository;
上面是局部变量的界说,在我们的示例代码中我们利用ABP框架来作为整个项目代码的基本框架,这里的IRepository接口来自于ABP框架中界说的接口范例用于直接操纵数据库表,这里详细的实现就是通过结构函数来举办注入的,详细请参考下面的实例。
public DegradedVehicleContractService(IObjectMapper objectMapper, IRepository<DegradedVehicleContract> degradedVehicleContractRepository, IRepository<Product> productRepository, IRepository<VehicleInformation> vehicleInformationRepository, IRepository<Company> companyRepository, IDegradedVehicleContractManager degradedVehicleContractManager, IRepository<ProductAffiProductCategory> productAffiProductCategoryRepository, IRepository<ProductCategoryBusinessDomain> productCategoryBusinessDomainRepository, IRepository<TiledProductCategory> tiledProductCategoryRepository, IRepository<BusinessDomain> businessDomainRepository, IMapper autoMapper) { _objectMapper = objectMapper; _degradedVehicleContractRepository = degradedVehicleContractRepository; _productRepository = productRepository; _vehicleInformationRepository = vehicleInformationRepository; _companyRepository = companyRepository; _degradedVehicleContractManager = degradedVehicleContractManager; _productAffiProductCategoryRepository = productAffiProductCategoryRepository; _productCategoryBusinessDomainRepository = productCategoryBusinessDomainRepository; _tiledProductCategoryRepository = tiledProductCategoryRepository; _businessDomainRepository = businessDomainRepository; _autoMapper = autoMapper; }
有了上面的注释,相信你对上面那部门代码可以有越发深入的领略,回到正题,这里到底是Product实体中的问题照旧VehicleInformation实体中存在问题呢?我们首先将
join vehicleDict in _vehicleInformationRepository.GetAll().Where(v => vinLists.Contains(v.Vin)) on detail.Vin equals vehicleDict.Vin
这个部门注释掉,然后再调试代码,我们发明代码竟然不报错了,然后劈头判定VehicleInformation这张表内里有问题,然后我们接着注释掉第二部门而保存第三部门,个中注释的部门代码为:
join product in _productRepository.GetAll().Where(p => productIds.Contains(p.Id)) on detail.ProductId equals product.Id
颠末这部门的操纵今后,我们发明执行报错,有了这两步的验证之后我们越发确认是VehicleInformation表中存在范例不匹配的问题,然后我们接着往下举办阐明。
2.3 定位报错字段既然报错信息中是SqlTypes.SqlString'和SqlTypes.SqlGuid之间的转换有问题那么我们断定有一个字段数据库中界说的范例和实体中界说的范例不匹配,并且个中有一种是guid范例,由于我们的实体中guid范例的字段要少于string范例的字段,所以我们首先从guid范例下手,我们看看VehicleInformation中是否有哪种guid范例和数据库不匹配。然后还真的发明白这个范例 public Guid UnionId { get; set; },在我们的实体中界说了一个guid范例的字段UnionId这个是在迁移进程迁移到数据库的,然后我们来查察数据库中的范例。
通过查询数据库我们发明数据库中字段UnionId被界说成了varchar(50)范例,明明在和代码中guid范例举办匹配的时候会产生错误,厥后我很迷惑我们的开拓模式是回收Code First来举办开拓的,现有实体然后再通过Migration举办数据库迁移的,应该不会呈现这样的错误,过后得知是别的一位同事在开拓的进程中手动去变动了这个实体的范例从而导致了这个问题,最后变动数据库UnionId字段范例,然后发明错误消失,至此问题办理。
总结