3

わかりました、これは少し「非正統的」に聞こえるかもしれませんが、VS2010 と Entity Framework の新しい POCO t4 テンプレート (ウォークスルー: Entity Framework の POCO テンプレート) を使用すると、素敵な POCO を生成できます。次に、これらの POCO を (DTO として) WCF サービスで使用し、本質的に EDM からクライアントに至るまでのすべての方法を使用できます。すべてが自動的に生成されることを除いて、この人が何をしているのか(EF 4.0およびWCF 4.0を使用したPOCO )。エンティティと DTO は「異なる必要がある」ことは理解していますが、この場合、クライアントとサーバーを処理しているため、DTO をモデルに含めて自動的に生成することにはいくつかの利点があります。

私の問題は、関係を持つエンティティを転送すると、クライアントが生成したコレクション (ICollection) に読み取り専用の値が設定されているため、その関係を操作できないことです。たとえば、既存の Order を取得すると、製品をクライアント側の Products コレクションに追加できません。Products コレクションは読み取り専用です。

私は、何十回ものサーバー ラウンド トリップ (AddProductToOrder(product) など) を行うよりも、クライアント側で一連の「注文編集」を行い、更新された注文を返送することを好みます。また、Entity と DTO の間で大量のサンクが発生しないようにしたいと考えています。全体として、これは私には良さそうです...読み取り専用部分を除いて。

解決策はありますか?それとも、これは SOA グレインに反しすぎていますか?

4

2 に答える 2

0

「lamouette」ソリューションは、参照されるアセンブリで機能します。

同じ問題があり、wcfシリアル化後にプロパティIsReadOnlyがtrueに設定されていることに気付きました(その前は、プロパティ値はfalseです)。

アセンブリを参照しました。「lamouette」によって提案された回避策では、パラメーター化されたコンストラクターを使用しますが、POCOテンプレートにはコンストラクターがありません。

ttを変更して、基本コンストラクターを呼び出すための空のコンストラクターを作成しました。これでうまくいきます。

于 2010-09-14T16:24:32.067 に答える
0

ICollection に割り当てられた FixupCollection は、逆シリアル化が発生すると配列として再作成されます。これが、 Products コレクションが読み取り専用になっている理由です。

これを変更するには、「サービス参照の追加」でオプション (少なくとも VS2010 に存在) を使用して、コレクションの種類を別のもの (Generic.List または Generic.Observable) に変更します。

ただし、既存のアセンブリに存在する型を再利用し、エンティティを含むアセンブリを参照するオプションを使用する場合、前のオプションは既存の型に適用されず、Products コレクションに Array が残ります。

私が使用する回避策 (クライアント側で型を再利用し、エンティティ アセンブリを参照する場合のみ) は、T4 テンプレートを変更して、コレクションが Products の取得で読み取り専用かどうかを確認し、そうであれば FixupCollection を設定することです。

if (<#=code.FieldName(navProperty)#>.IsReadOnly)
{
    var newCollection = new FixupCollection<<#=code.Escape(navProperty.ToEndMember.GetEntityType())#>>(<#=code.FieldName(navProperty)#>);
    newCollection.CollectionChanged += Fixup<#=navProperty.Name#>;
    <#=code.FieldName(navProperty)#> = newCollection;                   
}
于 2010-08-25T16:12:29.487 に答える