2012-10-02 13 views
7

ÇevreEF/çocuk varlıkları kapsayacak şekilde LINQ nasıl çift yönlü bir ilişki

Ben Framework 4.0 Varlık Framework 5 kullanıyorum varken. (Bu aslında EF 4.4 kullanıyorum anlamına gelir). Birimler olarak bir N-Katmanı uygulamasında çalışıyorum çünkü STE (Kendini İzleme Varlıkları) kullanıyorum. Bir veritabanı odaklı yaklaşım kullanıyoruz çünkü EF oyunda daha sonra tanıtıldı.

Bağlam

ben hem birbirlerine bir navigasyon özelliği vardır 2 Varlıkları var. (EntityA, EntityB'ye ve EntityB'ye EntityA'ya yönelik bir navigasyon özelliğine sahiptir). İlişki 'EntityA> Bire Birden Çok> EntityB' dir. Çocuk varlıkları bir LINQ ifadesiyle yüklemek istediğimde INCLUDE (STE => Eager Loading) kullanmam gerekiyor çünkü tüm verileri birkaç katmandan geçireceğim.

kod İşte

onun EntityB çocuklu EntityA çağırmak benim koddur.

using (var ctx = new MyEntities()) 
{ 
    var result = (from s in ctx.EntityA.Include("EntityB") 
        where s.Id = 11111 
        orderby s.TimeUpdated descending 
        select s) 
       .Take(10) 
       .ToList(); 
    return result; 
} 

hata

System.StackOverflowException { mevcut iplik yığın taşması durumunda olduğundan ifade değerlendiremez.} I uzaklaştırmak zaman bir hata var

'DAHİL'. Sanırım neden basittir. EntityA'yı EntityB çocuk kayıtlarıyla yüklemek istiyorum, EntityB kayıtları ana EntityA'yı her zaman ve EntityA'yı yüklemek istiyor ... Sanırım herkes burada sonsuz döngüyü anlıyor.

Benim çözümler veya alternatifler

  • benim EDMX dosyasına gidip EntityB içinde EntityA için navigasyon özelliğini kaldırın. Şimdi EntityA hakkında veriyi yüklemek istiyorsam, emrimi için bir EntityB var. Ayrı bir DB isteği yapmam gerekiyor ve katmanlarıma geçmek için kullanacağım 2 farklı nesneye sahibim.
  • Aşağıdakileri kullanmaktan kaçının, EntityA'yı ayrı olarak yükleyin ve EntityA'm'a başvuran benim EntityB'nin Navigasyon özelliğine aktarın.

soru

orada daha iyi alternatifler var ya da benim durumda bu sorunu gidermek için yaklaşımlar? Teklif ettiğim ya da yapmadığım alternatiflerimden birine devam etmeli miyim? Çünkü daha iyi ve daha temiz bir çözüm olmasını umuyordum.

Sana "Sen Include kullanabilirsiniz" ama belli ki bu durumda size yardım etmez söylemek için geldim

Ian

+1

+1 debug olamaz var. –

+0

Sorununuzu EF 5 (Visual Studio 2012) içinde yeniden oluşturmaya çalıştım ve herhangi bir hata alamıyorum. Soruna neden olabilecek başka bir şey var mı? Basit bir POCO kurulumu ile mi çalışıyor? (Sidenote .. Daha önce STE ile çalıştım ve şimdi onları engellemeye çalışıyorum. STE'yi kullanmak istediğinizden emin misiniz?) –

+0

Hatayı yeniden oluşturamıyorum (EF5, .NET 4.0). Stacktrace'i göndermek ve belki de hassas verileri silmek mümkün mü? –

cevap

1

Sorununuzu EF 5 (Visual Studio 2012) içinde yeniden oluşturmaya çalıştım ve herhangi bir hata alamıyorum. Soruna neden olabilecek başka bir şey var mı? Basit bir POCO kurulumu ile mi çalışıyor?

Ayrıca, STE'lerin size oldukça baş ağrısı verebileceğini de belirtmek isterim. Daha önce STE ile çalıştım ve şimdi onları engellemeye çalışıyorum. STE'yi kullanmak istediğinden emin misin?

STE'leri kullanmak yerine sade eski DTO'ları kullanabilirsiniz. Zengin etki alanı modelinizi sunucuda tutacak ve yalnızca istemciye gerekli olan verileri göndereceksiniz. Bu şekilde, her kullanım durumu için en az miktarda veriyle özel DTO'lar oluşturabilirsiniz.

0

Zaman ayırdığınız için teşekkür ederiz.

  1. Biz foreach kullanarak Load işlemlerini kullanmak ve el çocukları yükleyebilirsiniz: Sonsuz bir döngü durumda şüpheli (veya var) ne zaman genellikle internette okurken

    , bazı geçici çözümler vardır.

  2. Kendi başına view that is a recursive query numaralı bir veritabanını oluşturabiliriz (ve varlığını kullanın).
+0

- 1. Navigasyon özelliklerim _EntityCollections yok _ ama _TrackableCollection _ - 2. Yük işlemleri yapılamıyor çünkü bu durum bağlamım için geçerli değil. Örneğin, Ana Varlık'a (EntityA) kolayca erişmek ve onu EntityB'nin bir alanı olarak kaydetmek istiyorum. 'context.LoadProperty (EntityB, "EntityA")' yi test ettim, ancak aynı StackOverflowException işlevini de üretiyor. İpuçları için teşekkür ederiz –

0

see this

ancak güncelleme 4 yüklü ve hala sizin için çok iyi (1) soru için

İlgili konular