4

私は、一連の Web サービスと通信してデータを取得するリッチ WPF クライアントで構成されるエンタープライズ アプリケーションに取り組んでいます。このデータは、Code First EF 4.2 で作成された POCO です。

私は今、頭を包み込もうとしているが、良い解決策を見つけることができなかった概念的な問題に直面しています。

1:n アソシエーション

したがって、データモデルは次のようになります。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Children { get; set; }
}

サーバー側には、新しく作成された dtos (Children Collection の新しいアイテムを含む) をクライアント側から datacontext にアタッチして保存するインターフェイスがあります。もちろん、これは、これらのエンティティがクライアント側で作成され、追加のために送信された場合にのみ機能します。サービスは新しいエンティティを追加し、更新されたエンティティ (主に Id プロパティ) を返します。

[ServiceContract]
public interface IMyPersonCaretaker
{
    [OperationContract]
    Person CreatePerson(Person entity)
}

ただし、既存のエンティティを取得しているときは、関連付けを編集できません (エンティティの追加または削除 - エンティティは固定サイズであるため)。したがって、これを可能にするためにインターフェイスを拡張する必要があります。

[ServiceContract]
public interface IMyPersonCaretaker
{
    [OperationContract]
    Person CreatePerson(Person entity)

    [OperationContract]
    Person AddChild(Person parent, Person child)
}

私にはそれは不器用なアプローチのように思え、インターフェースはどんどん大きくなっています。これは POCO と連携する洗練されたアプローチですか? どのようにしますか?

手動マッピングによる n:m アソシエーション

データモデルの別の部分は次のようになります。

public class ClassA
{
    public int Id { get; set; }
    public virtual ICollection<AtoBMapping> Mappings { get; set; }
}

public class ClassB
{
    public int Id { get; set; }
    public virtual ICollection<AtoBMapping> Mappings { get; set; }
}

public class AtoBMapping
{
    public int Id { get; set; }
    public virtual ClassA A { get; set; }
    public virtual ClassB B { get; set; }
}

クライアント側で ClassA と ClassB のインスタンスを作成し、バインディングを介して相互に追加しようとすると、コンテキスト内の Set に追加しようとするとエラーが発生します。このエラーは、Mappings プロパティからアイテムを削除することは許可されていないことを示しており、これがどこから来ているのか本当にわかりません。

2 番目の部分は説明が少し抽象的すぎるかもしれませんが、誰かがさらに情報を必要とする場合は、喜んで追加します!

PS: Selftracking Entities を提案しないでください。私はそれらについて知っていますが、純粋に EF 4.2 POCO に基づくソリューションに本当に興味があります。

PPS: コードはこのウィンドウに直接書き込まれ、実際に使用されるコードではないため、不足している可能性がありますが、それは私の質問のポイントではないので、それで十分であることを願っています.

4

1 に答える 1

1

一連の CRUD タイプの操作が必要な同様のソリューションがありますが、データモデルはサーバーを離れません。オートマッパーを使用してオブジェクトを個別の DTO にマップします。これらの DTO は通常、WCF DatContract クラスであり、ドメイン モデル。

最初はこれは非常に冗長なアプローチのように思えるかもしれませんが、インターフェイスを明示的に制御でき、多くの場合、ドメイン モデル全体 (そのすべての関係を含む) をクライアントは、通常、非常に多くのデータしか表示できません。

別のオプションは WCF DataServices かもしれません。RESTful インターフェイスを使用してデータを転送します。

【新オプション】

私が過去に使用したもう1つのオプションは、基本的にバイト配列を取るCRUDサービスメソッドの1つだけです。NetDataContractSerializer を使用して、これらのメソッドとの間でオブジェクト グラフをシリアル化/逆シリアル化します。次に、データを前後に転送するカスタム クライアントを使用し、オブジェクトを作成し、それらを DataContext にアタッチして操作を行います....このようなもの

于 2011-11-22T15:58:43.587 に答える