Cách đưa đối tượng con của đối tượng con vào Entity Framework 5


138

Tôi đang sử dụng Entity Framework 5 code firstASP.NET MVC 3.

Tôi đang đấu tranh để có được đối tượng trẻ em của đối tượng trẻ em để cư trú. Dưới đây là các lớp học của tôi ..

Lớp ứng dụng;

public class Application
{
     // Partial list of properties

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

Lớp trẻ em:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

Lớp ChildRelationshipType:

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

     public string Name { get; set; }
}

Một phần của phương thức GetAll trong kho lưu trữ để trả về tất cả các ứng dụng:

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

Lớp Child chứa tham chiếu đến lớp ChildRelationshipType. Để làm việc với trẻ em của một ứng dụng, tôi sẽ có một cái gì đó như thế này:

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

Tôi nhận được một lỗi ở đây là bối cảnh đối tượng đã bị đóng.

Làm thế nào để tôi xác định rằng mỗi đối tượng con phải bao gồm ChildRelationshipTypeđối tượng như những gì tôi đã làm ở trên?


Câu trả lời:


256

Nếu bạn bao gồm thư viện, System.Data.Entitybạn có thể sử dụng quá tải Include()phương thức có biểu thức lambda thay vì chuỗi. Sau đó, bạn có thể Select()vượt qua trẻ em với các biểu thức Linq hơn là stringcác đường dẫn.

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

6
Như GraemeMiller đã nói, các lớp được gõ mạnh sẽ tốt hơn cho khả năng bảo trì hơn là sử dụng chuỗi
Ryan Amies

Phiên bản nào đã làm phương pháp lamba có sẵn? Tôi bị mắc kẹt trên một Codebase EF 4.0..và không thể làm cho các lamdas hoạt động. Cảm ơn cho bất kỳ đầu vào.
granadaCoder

5
Nó sẽ hoạt động trong EF 4, chỉ cần đảm bảo thêm một tham chiếu đếnSystem.Data.Entity;
Ryan Amies

5
FYI - Trong EF 6 không gian tên làMicrosoft.Data.Entity
Brad

Sử dụng EF 5, tôi không thể nhận được .Select (x => x.Child) nhưng điều này đã hoạt động - Entities.UserProfile archiveProfile = db.UserProfiles .Include (s => s.ShippingAddress) .Include (st => st.Shipping StateProvince) .Include (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .irstirstDefDefault (x => x.UserId == userId);
Geovani Martinez

91

Với EF Core trong .NET Core, bạn có thể sử dụng từ khóa ThenInclude:

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

Bao gồm trẻ em từ bộ sưu tập của trẻ em:

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

6
Cảm ơn!!! Thực sự hữu ích! Đôi khi bạn có thể nhận được intellisense sai, chỉ cần bỏ qua điều đó và xây dựng! :)
muhihsan

Thật tuyệt, tôi đang tìm kiếm lõi .net :)
Andy Clarke

1
Và nếu Trẻ em là một bộ sưu tập và tôi cần bao gồm các tài sản theo nó thì sao?
dodbrian

Tìm thấy một quá tải cho điều đó. Ban đầu không rõ ràng
dodbrian

1
@dodbrian Quá tải là gì? Tôi đang cố gắng làm tổ. Sau đó, trong đó đứa trẻ là một bộ sưu tập.
Greg Hardin

22

Tôi đã kết thúc việc làm sau đây và nó hoạt động:

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

76
Cách đánh mạnh là tốt hơn. Chuỗi ma thuật không tốt cho việc tái cấu trúc
GraemeMiller

2

Một ví dụ điển hình về việc sử dụng mẫu Kho lưu trữ chung và triển khai một giải pháp chung cho việc này có thể trông giống như thế này.

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

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

Làm thế nào tôi có thể gọi phương pháp trên? bạn có thể cung cấp một ví dụ
Jamee

@Jamee -List <Biểu thức <Func <PersonObject, object >>> ouers = new List <Expression <Func <PersonObject, object >>> (); bao gồm.Add (x => x.FirstName); Nhận <PersonObject> (bao gồm);
gcoleman0828

1
Và truy vấn đến từ ...?
Doug Beard

Xin lỗi @DougBeard, không theo dõi câu hỏi của bạn.
gcoleman0828

1
@ gcoleman0828 Biến truy vấn trong đoạn mã của bạn ở trên. Là nó kỳ diệu ngay lập tức? Nó đến từ đâu?
Râu Doug
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.