正規化されたテーブルのセットがあります。所有者、犬、ライセンス(これらは主要なものです)すべての所有者は複数の犬を持つことができ、すべての犬は複数のライセンスを持つことができます。飼い主の住所、犬の品種と色、ライセンスの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に遭遇させることができますか?