1

私はWCFを初めて使用しますが、今日、DataContractsで問題が発生しました。オブジェクトがWCFサービスからクライアントに返されるときに例外が発生します。

SvcTraceViewerは次の例外を示しています。

データコントラクト が 「 Person_7C797A477DD73534D4E8E743E1FCC1C75DAB75933D03B845A097 DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

解決策としていくつかのプロジェクトがあります。

  • DataAccess(EntityFramework EDMXファイルはここに配置されます)
  • モデル(DbContextGeneratorによって生成されたエンティティはここにあります)
  • WCFサービス(DataContractsはModelプロジェクトに実装されています)
  • WPFアプリケーション(ServiceHostを実行)
  • コンソールアプリケーション(WPFアプリケーションでホストされているWCFプロジェクトまたはサービスを呼び出します)

WCFの運用契約は次のとおりです。

[OperationContract]
Person[] GetAllPersons(int version);

インターフェイスの実装:

public Person[] GetAllPersons(int version)
{
    return StorageService.GetAllPersons(version);
}

クライアント側(ConsoleApp)でデータを受信すると、例外がスローされます。

部分的なクラスであるため、問題は生成されたエンティティに関連していると思います

これがPersonクラスです:

public partial class Person
{
    public Person()
    {
        this.Project = new HashSet<Project>();
    }

    public int Id { get; set; }
    public Nullable<long> AddressId { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public string FirstName { get; set; }
    public Nullable<long> GeoLocationId { get; set; }
    public string FullGeoLocationName { get; set; }
    public Nullable<long> SupervisorId { get; set; }
    public Nullable<long> PositionId { get; set; }
    public string Position { get; set; }
    public string Office { get; set; }
    public string NativeName { get; set; }
    public string Location { get; set; }
    public string FullName { get; set; }
    public Nullable<long> PmcPersonId { get; set; }

    public virtual ICollection<Project> Project { get; set; }
    public virtual PersonDataVersion DataVersion { get; set; }
    public virtual Workspace Workspace { get; set; }
}

クラスとそのメンバーに属性を付けようとしまし[DataContract][DataMember]が、それでもエラーが発生します。[KnownType(typeof(Person)]属性も役に立ちませんでした。

生成されたエンティティをデータコントラクトとして使用することは可能ですか?

4

2 に答える 2

2

DynamicProxies は、遅延読み込みを使用していることを示しており、WCF がオブジェクトをシリアル化しようとしたときにコンテキストが閉じられたためにエラーが発生した可能性があります。

遅延読み込みを無効にして、代わりに熱心な読み込みを使用してみてください。

于 2012-11-06T19:13:16.787 に答える
0

Person オブジェクトをデータ転送オブジェクトまたは Poco オブジェクトにマッピングする必要があります。それに応じて、これらのプロパティを DataMember 属性で装飾できます。遅延読み込みを無効にする必要がある場合は、ORM の利点が失われ、クエリが使用していない可能性のあるデータに対して実行されます。小規模なシステムでは大きな問題ではないかもしれませんが、システムが成長するにつれて、それらを屈服させる可能性があります。

于 2012-11-06T19:42:45.870 に答える