尝试使用C#实体框架检索嵌入式/相关类

时间:2020-02-26 09:24:53

标签: c# entity-framework

假设我有一个像这样的数据结构-一个Person对象可能有很多地址,而一个地址可能有很多地址线。

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Address> Addresses { get; set; }
}


public class Address
{
    public int Id { get; set; }
    public List<AddressLine> AddressLines { get; set; } 
    public string PostCode { get; set; }
}

public class AddressLine
{
    public int Id { get; set; }
    public string AddressLine
}

然后,我使用实体框架允许将该数据结构存储到我的数据库中,从而:

public class DatabaseContext : DbContext
{
    public DatabaseContext() : base("name=DatabaseConnection") { }
    public DatabaseContext(string connectionString) : base(connectionString) { }
    public DbSet<Person> People { get; set; }
}

最后,我有一个与此数据库进行交互的类:

public class ProcessPeople
{
    private DatabaseContext localDatabase;

    ProcessPeople(DatabaseContext db)
    {
        localDatabase = db;
    }

    public DoProcessingOfPerson(int idOfPerson)
    {
         Person person =
                localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

         Console.WriteLine("First  : " + person.FirstName);
         Console.WriteLine("Last   : " + person.LastName);

         // Print address
         if(person.Addresses != null && person.Addresses.Count > 0)
         {
             if(person.Addresses[0].AddressLines != null && person.Addresses[0].AddressLines.Count > 0)
             {
                 Console.WriteLine("Address: " + person.Addresses[0].AddressLines[0].AddressLine);
             }
         }
         else
         {
             Console.WriteLine("No address available");
         }
    }
}

问题在于,使用以下代码检索到该人之后:

Person person =
      localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

即使其中肯定有相关的Address和AddressLine数据,Addresses数组也总是 为空。

我的问题:

如何从Entity框架数据库中进行检索,以便同时检索Person类内嵌类中的所有数据?

我想拉一个人,然后能够在Addresses和AddressLines数组中导航-但是不会从数据库中检索这些类(即使它们存在于由实体生成的实际数据库中)框架]

请注意,为简便起见,我没有包含数据输入代码-我只是在寻找我需要对这一行进行的操作:

Person person =
    localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

为了获得所有填充在变量“ person”中的对象和子对象,假设存在相关数据。

感谢堆提供的任何帮助

大卫。

1 个答案:

答案 0 :(得分:1)

您应按以下方式使用Include

Person person = localDatabase.People
                                .Include(p=> p.Addresses)
                                    .ThenInclude(add => add.AddressLine)
                                .Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

有关更多详细信息:Loading Related Entities

相关问题