Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架多级连接_C#_Entity Framework Core - Fatal编程技术网

C# 实体框架多级连接

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

对于我的初学者问题

我正在使用EntityFrameworkCore2.0.2,并试图找出我的IP地址集合为空的原因

我有三种型号的设备、Nic和IP地址池,它们处于1+N关系中: 1个设备->n个NIC->n个IP地址

我正试图将这个星座纳入我的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;
    }
私有列表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扩展方法确实是这样工作的。没有智能感知。感谢所有引导我走向正确方向的人。竖起大拇指。