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.