40

この最も簡単な例として、コレクションを取得し、WebAPIを介して出力しようとします。

// 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;

しかし、それは私がやろうとしている多くの目的を打ち破ります。もっと良い方法はありますか?

4

10 に答える 10

26

プロキシ作成を無効にするのは、不要な場所、または問題を引き起こしている場所でのみ行うことをお勧めします。グローバルに無効にする必要はありません。コードを介して現在の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 });
    }

ここでは、このメソッドでProxyCreationのみを無効にしました。これは、リクエストごとに新しいDBContextが作成されるため、この場合はProxyCreationのみを無効にしたためです。それが役に立てば幸い

于 2014-04-29T18:33:58.077 に答える
25

ナビゲーションプロパティがあり、それらを非仮想化したくない場合は、JSON.NETを使用し、App_Startの構成をXMLではなくJSONを使用するように変更する必要があります。
JSON.NETをインストールした後、NuGetから、このコードをWebApiConfig.csのRegisterメソッドに挿入します

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
于 2015-02-15T09:13:53.587 に答える
13

ナビゲーションプロパティがある場合は、それらを非仮想にします。マッピングは引き続き機能しますが、シリアル化できない動的プロキシエンティティの作成を防ぎます。]

WebApiでは、永続的な接続がなく、とにかく.ToList()を実行したため、遅延読み込みがなくても問題ありません。

于 2013-08-21T14:28:37.433 に答える
8

必要に応じてプロキシクラスを無効にしました。

    // GET: ALL Employee
    public IEnumerable<DimEmployee> Get()
    {
        using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities())
        {
            entities.Configuration.ProxyCreationEnabled = false;
            return entities.DimEmployees.ToList();
        }
    }
于 2016-10-21T03:32:47.463 に答える
7

Global.asax.csApplication_Startの関数に次のコードを追加します。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

これにより、すべての応答をJSONにシリアル化し、XML応答を削除するようにAPIに指示します。

于 2017-06-05T05:28:39.247 に答える
3

私の場合、返されるオブジェクトには、引数のない/デフォルトのコンストラクターを持たない型のプロパティが含まれていました。その型に引数ゼロのコンストラクターを追加することにより、オブジェクトを正常にシリアル化できます。

于 2016-08-12T20:16:03.560 に答える
1

同じ問題が発生し、DTOにパラメーターレスコンストラクターがありませんでした。

public UserVM() { }

public UserVM(User U)
    {
        LoginId = U.LoginId;
        GroupName = U.GroupName;
    }

最初のコンストラクターがありませんでした。

于 2020-12-06T11:48:41.420 に答える
1

このエラーメッセージが表示されましたが、問題は、2つのプロパティに同じシリアル化されたプロパティ名を使用するようにクラスを誤って設定したことでした。

public class ResultDto
{
    //...
    [JsonProperty(PropertyName="DataCheckedBy")]
    public string ActualAssociations { get; set; }
    [JsonProperty(PropertyName="DataCheckedBy")]
    public string ExpectedAssociations { get; set; }
    //...
}

このエラーが発生し、APIを介してエンティティを直接送信していない場合は、シリアル化に失敗したクラスをLINQPadにコピーして呼び出すだけJsonConvert.SerializeObject()で、このがらくたよりも優れたエラーメッセージが表示されます。これを試してみるとすぐに、次のエラーメッセージが表示されました。A member with the name 'DataCheckedBy' already exists on 'UserQuery+ResultDto'. Use the JsonPropertyAttribute to specify another name.

于 2021-03-17T14:02:02.287 に答える
0

プロキシ作成を無効にした後、積極的な読み込み(Include())を使用してプロキシオブジェクトを読み込みます。

于 2020-04-26T00:12:22.833 に答える
0

私のプロジェクトでは、WebApiアクションメソッドから返されたEntityCollection。 Configuration.ProxyCreationEnabled = false適用できない。私はそれが私のためにうまく働いている以下のアプローチを試しました。

  1. コントロールパネル。2.Windowsの機能をオンまたはオフにします
  2. インターネットインフォメーションサービスを選択する
  3. すべてのワールドワイドWebコンポーネントを確認するIISのすべてのコンポーネントを確認することをお勧めします。
  4. コンポーネントをインストールします。
  5. (IIS)に移動し、コマンドプロンプトでinetmgrと入力します。
  6. 仮想ディレクトリで公開されたコードを選択します。
  7. アプリケーションに変換する
  8. アプリケーションを参照します。
于 2020-06-16T15:51:07.630 に答える