4
  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コントローラーでは、作業単位パターンを使用しています。ここに私の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 エラーが返されます。


アップデート:


「Test」と呼ばれる別のアソシエーションを Vehicle に追加しました。GetAll メソッドは次のとおりです。

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

エラーはありません。すべてのデータがフィドラー経由で返されました。したがって、「非直接的な関連付け」(つまり、Vehicle -> VehicleMake) がエラーの原因であると思われます。


質問:


関連する車両データとそれに関連するクラスのデータを取得し、Http 500 エラーを発生させずに Json に返す正しい方法は何でしょうか?

4

1 に答える 1

4

*解決済み*


これは機能します:

  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 には VehicleModels のコレクションがあります。デバッグ コードを調べたところ、VehicleModel から VehicleMake、VehicleModel などへのカスケードが確認できました。これは循環型であることを意味していました。

匿名型を使用したり、ナビゲーション プロパティから仮想キーワードを削除したりしないより良い方法を誰かが知っている場合は、ぜひ知りたいと思います。しかし、これは本当に機能します。

最終的な注意: モデルのプロパティ名を匿名型で使用しないように注意してください。つまり、プロパティ「TransmissionType」を「VehTransmissionType」などに置き換えてください。

于 2012-11-03T21:46:41.823 に答える