实体框架多级联接

时间:2018-04-13 11:11:31

标签: c# entity-framework-core

我的初学者问题。

我正在使用Entity Framework Core 2.0.2,我试图找出为什么我的IpAddresses集合为空。

我有三个模型Device,Nic和IpAddressPool,它们处于1 + N关系: 1设备 - > n Nics - > n IpAddresses。

我正试图让这个星座进入我对MVC项目的看法。

我在IndexController中获取数据的方法如下所示:

private List<Device> GetDevicesAsync()
    {
        var devices = _context.Devices
                      .Include(nics => nics.Nics)
                      .OrderBy(o => o.DeviceMetadata.DeviceType.SortNumber)
                      .ThenBy(o => o.DeviceMetadata.DeviceName)
                      .ToList();
        return devices;
    }

在我的Devices-Class中,有一个ICollection&lt;'Nic'&gt;类型的导航属性。在我的Nic-Class中有一个ICollection类型的导航属性&lt;'IpAddressPool'&gt;

在视图中我迭代模型设备和每个设备我遍历Devices.Nics一切都很好,但是当我迭代我的nics以获得绑定到nic的所有IpAddresses时它总是为null: 请注意,我已将IpAddressPools的Collection插入到一个变量中进行测试,然后该变量为null。

var devices = Model.Devices;
    foreach (var d in devices)
    {
        <tr>
            <td>@d.id</td>
            <td>@d.DeviceMetadata.DeviceName</td>
            <td>@d.DeviceMetadata.DeviceType.TypeName</td>
            <td>@d.DeviceMetadata.Manufacturer.ManufacturerName</td>
            <td>
                @{ 
                    foreach (var nic in d.Nics)
                    {
                        <b>@nic.Brand</b><br />
                        var nics = nic.IpAddressPools;
                    }
                }
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@d.id">Edit</a> |
                <a asp-action="Details" asp-route-id="@d.id">Details</a> |
                <a asp-action="Delete" asp-route-id="@d.id">Delete</a>
            </td>
        </tr>

为什么IpAddressPools的集合不在字段中这与我在Nic上的方法相同?

在我的数据库IpAddressPools中,Nicid充满了nic的id,尽管我认为在视图中不应该引发null异常。相反,它应该只显示没有IpAddress。

我认为我的错误在LINQ语句中,因为我引用了Nics而不是IpAddressesPool,因为我还没弄清楚如何获取它。 因为nics.Nics返回一个nics集合,所以我无法指向IpAddressesPool。

当我是对的时候,我如何设法从池中获取与它相关的IP地址?

非常感谢你的帮助。 monsee

1 个答案:

答案 0 :(得分:1)

我不确定我是否遵循了所有解释,但如果您想让EF(Core)在集合中包含其他集合,您可以使用ThenInclude,如下所示:

  _context.Devices
     .Include(device => device.Nics) // I renamed the parameter for clarity heer
     .ThenInclude(nic => nic.IpAddressPools) // supposing the navigation property is called IpAddressPools, of course.

Alos,请注意,Intellisense可能在开始时抱怨并且不允许您自动填写“然后包含”,但是一旦您正确地编写了它,它将正确检测语法(并且它无论如何都会编译。)