实体框架:如何在向数据库添加或更新数据时包含嵌套子节点

本文关键字:数据 更新 包含 子节点 嵌套 添加 数据库 框架 实体 | 更新日期: 2023-09-27 18:16:03

下面我将插入客户和嵌套子节点。客户有子呼叫地址,地址有子呼叫联系人详细信息。

    using (var db = new TestDBContext())
    {
        var customer = new Customer
        {
            FirstName = "Test Customer1",
            LastName = "Test Customer1",
            Addresses = new List<Addresses>
            {
                new Addresses
                {
                    Address1 = "test add1",
                    Address2 = "test add2",
                    IsDefault=true,
                    Contacts =  new List<Contacts>
                    {
                       new Contacts {  Phone = "1111111", Fax = "1-1111111",IsDefault=true, SerialNo=1 },
                       new Contacts {  Phone = "2222222", Fax = "1-2222222",IsDefault=false, SerialNo=2  }
                    }
                },
                new Addresses
                {
                    Address1 = "test add3",
                    Address2 = "test add3",
                    IsDefault=false,
                    Contacts =  new List<Contacts>
                    {
                       new Contacts {  Phone = "33333333", Fax = "1-33333333",IsDefault=false, SerialNo=1 },
                       new Contacts {  Phone = "33333333", Fax = "1-33333333",IsDefault=true, SerialNo=2  }
                    }
                }
            }
        };
        db.Customer.Add(customer);
        db.SaveChanges();
        int id = customer.CustomerID;
    }

假设现在我想更新客户及其关联的地址和联系人详细信息。

i浏览器很少有类似的线程在这里。我看到人们删除子数据并插入新的而不是更新。这里有一个链接https://stackoverflow.com/a/27177623/728750

它们以这种方式包含child

var existingParent = _dbContext.Parents
        .Where(p => p.Id == model.Id)
        .Include(p => p.Children)
        .SingleOrDefault();

但是在我的情况下,我有多个子节点,比如地址和联系方式,那么我怎么能包括客户的第一个地址,然后我想包括地址的联系方式子节点。

请告诉我怎么做。

实体框架:如何在向数据库添加或更新数据时包含嵌套子节点

你在找这个吗

using System.Data.Entity; // NB!
var company = dbContext.Parents
                     .Include(co => co.Addresses.Select(ad=> ad.Contacts))
                     .FirstOrDefault(p =>  p.Id == model.Id);

简短示例

var company = context.Companies
                 .Include(co => co.Employees.Select(emp => emp.Employee_Car))
                 .Include(co => co.Employees.Select(emp => emp.Employee_Country))
                 .FirstOrDefault(co => co.companyID == companyID);

。包含Msdn详细信息汇总

包含集合、集合和引用两个级别down: query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection.Select(l2 => l2.Level3Reference)))