gpt4 book ai didi

entity-framework - 工作单元、LazyLoading 已禁用、通用存储库、IncludeMultiple、Http 500 错误

转载 作者:行者123 更新时间:2023-12-03 02:00:17 25 4
gpt4 key购买 nike

  1. 我有一辆与型号关联的车辆,型号与制造商关联。

  2. 这是我的通用存储库,与我的项目中 LazyLoadingEnabled = false 的关联相关:

    public IQueryable<T> IncludeMultiple<T1>(params Expression<Func<T, object>>[] associations) where T1 : class
    {
    var source = (IQueryable<T>)DbContext.Set<T>();
    if (associations != null)
    {
    foreach (Expression<Func<T, object>> path in associations)
    source = DbExtensions.Include<T, object>(source, path);
    }
    return source;
    }
  3. 在我的 API Controller 中,我使用工作单元模式。这是我的 GetAll 方法:

    public IEnumerable<Vehicle> GetAll()
    {
    var vehicles = Uow.VehicleRepository.IncludeMultiple<Vehicle>(c => c.VehicleModel).ToList();
    return vehicles;
    }

一切正常,Json 检索 Vehicle 类数据以及相关的 VehicleModel 类数据。

但是,Vehicle 与 VehicleMake 没有直接关联,只有 VehicleModel 具有直接关联。现在,如果我的 GetAll 方法具有以下内容:

    public IEnumerable<Vehicle> GetAll()
{
var vehicles = Uow.VehicleRepository.IncludeMultiple<Vehicle>(c => c.VehicleModel, c => c.VehicleModel.VehicleMake).ToList();
return vehicles;
}

虽然我在调试中看到车辆确实具有车辆及其相关的 VehicleModel 和 VehicleMake 数据,但它在 Fiddler 中返回 Http 500 错误。

<小时/>

更新:

<小时/>

在 Vehicle 中添加了另一个名为“Test”的关联,其 GetAll 方法为:

(c => c.VehicleModel, c => c.Test)

没有错误,所有数据都是通过fiddler返回的。因此,“非直接关联”(即 Vehicle -> VehicleMake)似乎是错误的原因。

<小时/>

问题:

<小时/>

在不出现 Http 500 错误的情况下检索相关车辆数据及其关联类数据并将其返回到 Json 的正确方法是什么?

最佳答案

<小时/>

*已解决*

<小时/>

这有效:

  public HttpResponseMessage GetAll()
{
var vehicles = from data in Uow.VehicleRepository.IncludeMultiple<Vehicle>(c => c.VehicleModel,c => c.VehicleModel.VehicleMake)
select new
{
VehDesc = data.Description,
VehVIN = data.VIN,
VehTransmissionType = data.TransmissionType,
VehFuelType = data.FuelType,
VehYear = data.Year,
VehMileage = data.Mileage,
VehCylinderSize = data.CylinderSize,
VehEngineSize = data.EngineSize,
VehVehicleModel = data.VehicleModel.Name,
VehMakeName = data.VehicleModel.VehicleMake.Name
};
return Request.CreateResponse(HttpStatusCode.OK, vehicles);
}

基本上,

 1. I used an HttpResponseMessage as my return type;

2. I used projection to create an anonymous type;

为什么我必须这样做?

据我所知,问题集中在 JSON 接收到 VehicleModel 和 VehicleMake 的“循环”返回。也就是说,VehicleModel 与VehicleMake 具有关联,并且VehicleMake 具有VehicleModel 的集合。当我查看调试代码时,我可以看到从 VehicleModel 到 VehicleMake 再到 VehicleModel 的级联,等等,所以对我来说这意味着它是循环的。

如果有人知道更好的方法,不使用匿名类型,也不从我的导航属性中删除虚拟关键字,我当然想知道。但这确实有效。

最后注意:请确保不要在匿名类型中使用模型的属性名称,即将属性“TransmissionType”替换为“VehTransmissionType”之类的内容。

关于entity-framework - 工作单元、LazyLoading 已禁用、通用存储库、IncludeMultiple<T>、Http 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13211731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com