この最も単純な例では、コレクションを取得し、Web APIを介して出力しようとします。
// GET api/items
public IEnumerable<Item> Get()
{
return MyContext.Items.ToList();
}
そして、私はエラーを取得します:
タイプのオブジェクト
'System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]'は型に変換できません
'System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]'
これは、新しいプロキシでよく発生するエラーであり、次のように設定することで修正できることがわかっています。
MyContext.Configuration.ProxyCreationEnabled = false;
しかし、それは私がやろうとしていることの多くの目的を無効にします。もっと良い方法はありますか?
プロキシ作成を無効にするのは、必要のない場所、または問題が発生している場所のみにしてください。グローバルに無効にする必要はありません。コードで現在のDBコンテキストを無効にできます。
[HttpGet]
[WithDbContextApi]
public HttpResponseMessage Get(int take = 10, int skip = 0)
{
CurrentDbContext.Configuration.ProxyCreationEnabled = false;
var lista = CurrentDbContext.PaymentTypes
.OrderByDescending(x => x.Id)
.Skip(skip)
.Take(take)
.ToList();
var count = CurrentDbContext.PaymentTypes.Count();
return Request.CreateResponse(HttpStatusCode.OK, new { PaymentTypes = lista, TotalCount = count });
}
ここでは、リクエストごとに新しいDBContextが作成されるため、このメソッドでProxyCreationのみを無効にしました。したがって、このケースではProxyCreationのみを無効にしました。それが役に立てば幸い
ナビゲーションプロパティがあり、それらを非仮想にしたくない場合は、JSON.NETを使用し、App_Startの構成をXMLではなくJSONを使用するように変更する必要があります。
JSON.NETをNuGetからインストールした後、このコードをRegisterメソッドのWebApiConfig.csに挿入します
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
ナビゲーションプロパティがある場合は、それらを非仮想にします。マッピングは引き続き機能しますが、シリアル化できないダイナミックプロキシエンティティの作成を防ぎます。]
永続的な接続がなく、とにかく.ToList()を実行したため、WebApiでは遅延読み込みを行わなくても問題ありません。
必要に応じてプロキシクラスを無効にしました。
// GET: ALL Employee
public IEnumerable<DimEmployee> Get()
{
using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities())
{
entities.Configuration.ProxyCreationEnabled = false;
return entities.DimEmployees.ToList();
}
}
これは私を助けました:
次のコードをGlobal.asax.csのApplication_Start
関数に追加します
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
私の場合、返されるオブジェクトには、引数なし/デフォルトコンストラクターを持たないタイプのプロパティが含まれていました。引数なしのコンストラクタをその型に追加することにより、オブジェクトを正常にシリアル化できます。