2

正規化されたテーブルのセットがあります。所有者、犬、ライセンス(これらは主要なものです)すべての所有者は複数の犬を持つことができ、すべての犬は複数のライセンスを持つことができます。飼い主の住所、犬の品種と色、ライセンスのLicenseTypeなど、これらの各オブジェクトに関連付けられた参照テーブルがいくつかあります。私はそれらが私の問題だとは思わない。

これは本質的にコードファースト(リバースエンジニアリングコードファーストツールを使用)であるため、EDMXはありません。循環参照の問題があり、それが私を殺しています。私が読んだすべての記事は、IsReference=true属性を設定するためだけに言っています。これは、親子関係だけの場合に最適です。私は祖父母-親-子の関係にあります。私は運が悪かったのでこの記事を試しました。たくさんの記事がありますが、そのほとんどは4歳以上です。.Net 4(4.5ではなく)で何をして動作するかを知りたいのですが、この状況で私だけが存在することはできません。私の脳はこの時点でドロドロです。

これがデータベースからオブジェクトを取得する私のコードです。それはチャンピオンのように機能します。

using (DogLicensingContext db = new DogLicensingContext()) {
    Result = (from l in db.Licenses
        .Include(x => x.Dog) // Get the Dog on this License
        .Include(x => x.Dog.Owner)
        .Include(x => x.Dog.Owner.Title)
        .Include(x => x.Dog.Owner.Dogs) // Gets me all of their Dogs
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Licenses))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Licenses.Select(l => l.TagStyle)))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Breed))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Color))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Color1))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.HairLength))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Sex))
        .Include(x => x.Dog.Owner.Address)
        .Include(x => x.Dog.Owner.Address.State)
        .Include(x => x.Dog.Owner.Phones)
        .Include(x => x.Dog.Owner.Emails)
        .Include(x => x.Dog.Owner.Phones.Select(p => p.PhoneType))
        .Include(x => x.Dog.Owner.Emails.Select(p => p.EmailType))
    where l.BarCode == BarCode
    select l).FirstOrDefault();
} // using the database

これは、OwnerクラスとDogクラスの縮小図です。

オーナークラス:

[DataMember]
public Nullable<System.DateTime> UpdatedOn { get; set; }
[DataMember]
public int ID { get; set; }

public virtual ICollection<Dog> Dogs { get; private set; }

犬のクラス:

[DataMember]
public Nullable<System.DateTime> UpdatedOn { get; set; }
[DataMember]
public int ID { get; set; }

[DataMember]
public virtual Owner Owner { get; set; }

public virtual ICollection<License> Licenses { get; set; }

このようにテストクライアントで動作します。ICollectionDogsまたはICollectionLicensesを作成した場合、DataMemberはStackOverflowを取得したときです。

では、どうすればコレクションをWCFに遭遇させることができますか?

4

1 に答える 1

4

ReferencePreservingDataContractFormat ここを使用します。

次に、wcf サービス メソッド (操作コントラクト) を次の属性でマークします。

[OperationContract]
[ReferencePreservingDataContractFormat]
List<Dog> GetDogsAndOwners();
于 2012-11-19T15:41:46.140 に答える