C# 实体框架多级连接
对于我的初学者问题 我正在使用EntityFrameworkCore2.0.2,并试图找出我的IP地址集合为空的原因 我有三种型号的设备、Nic和IP地址池,它们处于1+N关系中: 1个设备->n个NIC->n个IP地址 我正试图将这个星座纳入我的MVC项目视图中 我在IndexController中获取数据的方法如下所示:C# 实体框架多级连接,c#,entity-framework-core,C#,Entity Framework Core,对于我的初学者问题 我正在使用EntityFrameworkCore2.0.2,并试图找出我的IP地址集合为空的原因 我有三种型号的设备、Nic和IP地址池,它们处于1+N关系中: 1个设备->n个NIC->n个IP地址 我正试图将这个星座纳入我的MVC项目视图中 我在IndexController中获取数据的方法如下所示: private List<Device> GetDevicesAsync() { var devices = _context.Devi
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;
}
私有列表getDeviceAsync()
{
var devices=\u context.devices
.Include(NIC=>nics.nics)
.OrderBy(o=>o.DeviceMetadata.DeviceType.SortNumber)
.ThenBy(o=>o.DeviceMetadata.DeviceName)
.ToList();
返回装置;
}
在我的设备类中,有一个ICollection类型的导航属性,在我的Nic类中,有一个ICollection类型的导航属性
在视图中,我迭代模型设备,每个设备迭代设备。nic一切正常,但当我在nic中迭代以获得绑定到nic的所有IP地址时,它始终为空:
请注意,我已将IpAddressPools集合插入到一个用于测试的变量中,该变量随后为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>
var-devices=Model.devices;
foreach(设备中的var d)
{
@d、 身份证
@d、 DeviceMetadata.DeviceName
@d、 DeviceMetadata.DeviceType.TypeName
@d、 DeviceMetadata.Manufacturer.ManufacturerName
@{
foreach(d.Nics中的变量nic)
{
@nic.品牌
var nics=nic.IpAddressPools;
}
}
编辑|
细节|
删除
为什么IpAddressPools的集合不是字段?它与我在Nic上使用的方法相同
在我的数据库IpAddressPools中,Nicid用nic的id填充,尽管我认为不应该在视图中引发空异常。相反,它应该只是不显示IpAddress
我假设我的错误在LINQ语句中,因为我引用的是NIC,而不是IPAddressSpool,因为我还没有弄清楚如何获取它。
因为nics.nics返回一个NIC集合,所以我无法指向IPAddressSpool
如果我是对的,如何从池中获取与其nic相关的IP地址
非常感谢你的帮助。
monsee我不确定我是否遵循了您的所有解释,但是如果您想让EF(Core)在集合中包含另一个集合,您可以使用
然后像这样包含它:
_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.
阿洛斯,请注意,可能Intellisense在开始时抱怨,不允许您自动完成“ThenClude”,但一旦您编写正确,它将正确检测语法(无论如何它都会编译).问题出在这里,因为在Nic类中,导航属性的类型为ICollection,您无法通过Nic=>Nic.IpAddressPools获取它。当我声明IpAddressPool类型的属性时,将在下次迁移时在我的Nic表中创建一个IpAddressPoolid列,我将取消1+n关系。“在Nic类中,导航属性的类型为ICollection,您无法通过Nic=>Nic.IpAddressPools获得它。是的,您可以。这就是导航属性和ThenInclude的要点。@monsee此Intellisense问题现在甚至在文档的一节中提到:”请注意,当前版本的Visual Studio提供了不正确的代码完成选项……”哇,这真的很糟糕。但ThenInclude扩展方法确实是这样工作的。没有智能感知。感谢所有引导我走向正确方向的人。竖起大拇指。