我的初学者问题。
我正在使用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
答案 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可能在开始时抱怨并且不允许您自动填写“然后包含”,但是一旦您正确地编写了它,它将正确检测语法(并且它无论如何都会编译。)