Entity Framework 5'e bir alt nesnenin alt nesnesi nasıl eklenir


138

Ben kullanıyorum Entity Framework 5 code firstve ASP.NET MVC 3.

Bir çocuk nesnesinin alt nesnesini doldurmak için uğraşıyorum. Aşağıda derslerim ..

Uygulama sınıfı;

public class Application
{
     // Partial list of properties

     public virtual ICollection<Child> Children { get; set; }
}

Çocuk sınıfı:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

ChildRelationshipType sınıfı:

public class ChildRelationshipType
{
     public int Id { get; set; }

     public string Name { get; set; }
}

Tüm uygulamaları döndürmek için depodaki GetAll yönteminin bir parçası:

return DatabaseContext.Applications
     .Include("Children");

Child sınıfı, ChildRelationshipType sınıfına başvuru içerir. Bir uygulamanın çocukları ile çalışmak için şöyle bir şey olurdu:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

Burada nesne bağlamı zaten kapalı bir hata alıyorum.

Her alt nesnenin ChildRelationshipTypeyukarıda yaptığım gibi bir nesne içermesi gerektiğini nasıl belirleyebilirim ?


Yanıtlar:


256

Kitaplığı System.Data.Entityeklerseniz, Include()dize yerine lambda ifadesi alan yöntemin aşırı yüklenmesini kullanabilirsiniz . Daha sonra yollar Select()yerine Linq ifadeleri olan çocuklar üzerinde yapabilirsiniz string.

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));

6
GraemeMiller'in dediği gibi, güçlü bir şekilde yazılmış sınıflar, sürdürülebilirlik için dizeleri kullanmaktan daha iyidir
— Ryan Amies

Lamba yöntemi hangi sürümde mevcuttu? Ben bir EF 4.0 Codebase sıkışmış ... ve lamdas çalışmak için alamıyorum. Herhangi bir giriş için teşekkürler.
— granadaCoder

5
EF 4'te çalışacak, sadece bir referans eklediğinizden emin olunSystem.Data.Entity;
— Ryan Amies

5
FYI - EF 6'da isim alanıMicrosoft.Data.Entity
— Brad

EF 5 kullanarak .Select (x => x.Child) alamadım ama bu çalıştı - Entities.UserProfile depoProfile = db.UserProfiles .Include (s => s.ShippingAddress) .Include (st => st.ShippingAddress. StateProvince) .Include (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .FirstOrDefault (x => x.UserId == userId);
— Geovani Martinez

91

.NET Core'daki EF Core ile şu anahtar kelimeyi kullanabilirsiniz ThenInclude:

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

Çocuk koleksiyonundan çocukları dahil et:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);

6
Teşekkürler!!! Gerçekten yardımcı! Bazen yanlış bir fikir alabilirsin, sadece görmezden gel ve inşa et! :)
— muhihsan

Güzel olan, .net çekirdeği arıyordum :)
— Andy Clarke

1
Ve eğer Çocuklar bir koleksiyonsa ve onun altına mülkler eklemem gerekiyorsa ne olacak?
— dodbrian

Bunun için bir aşırı yük buldum. İlk başta belli değildi.
— dodbrian

1
@dodbrian Aşırı yük neydi? Ben çocuk bir koleksiyon olduğu .ThenInclude, iç içe çalışıyorum.
— Greg Hardin

22

Aşağıdakileri yaptım ve işe yarıyor:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");

76
Güçlü yazılan yol daha iyidir. Büyü dizeleri yeniden düzenleme için iyi değil
— GraemeMiller

2

Genel Depo kalıbını kullanmaya ve bunun için genel bir çözüm uygulamaya iyi bir örnek böyle görünebilir.

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

Yukarıdaki yöntemi nasıl arayabilirim? bir örnek verebilir misiniz
— Jamee

@Jamee -List <İfade <Func <PersonObject, nesne >>> includers = yeni Liste <İfade <Func <PersonObject, nesne >>> (); addders.Add (x => x.İlkAdı); Al <PersonObject> (includers);
— gcoleman0828

1
Ve sorgu geliyor ...?
— Doug Beard

Üzgünüz @ DooBeard, sorunuzu takip etmiyor.
— gcoleman0828

1
@ gcoleman0828 Yukarıdaki kod snippet'inizdeki sorgu değişkeni. Sihirli bir şekilde başlatılıyor mu? Nereden geliyor?
— Doug Beard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.