包含在EF Core 2.0中可创建无限的嵌套子实体

时间:2018-12-11 15:00:43

标签: entity-framework asp.net-core entity-framework-core automapper

我有2个具有一对一关系的实体,模型为:

public class Asset
{
    public int Id { get; set; }
    public string Name { get; set; }
    public TrackingDevice TrackingDevice { get; set; }
}

public class TrackingDevice
{
    public int Id { get; set; }
    public string Imei { get; set; }
    public int? AssetId { get; set; }
    public Asset Asset { get; set; }
}

我已经输入数据,所以当我进行如下简单查询时:

var list = _appContext.TrackingDevices.Include(td => td.Asset).ToListAsync();

我正确地获得了包含其资产的跟踪设备的列表,但是,资产子级又包含了跟踪设备,这又依次是资产等等,从而创建了一个无限结构,该结构在应用{{1} }失败。

如何进行“包含”并仅获取我需要的2个级别? 跟踪设备->资产

2 个答案:

答案 0 :(得分:0)

您要构建的是资产与跟踪设备之间的一对一关系。 您的代码(如果配置不正确)实际上会告诉EF Core您每个实体都有与之链接的实体。

要使EF Core理解这一点,您需要使用这种方式来声明您的关系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Asset>()
        .HasOne(a => a.TrackingDevice)
        .WithOne(t => t.Asset)
        .HasForeignKey<TrackingDevice>(b => b.AssetId);
}

请查看here,以获取有关如何进行此设置的更多信息。

此外,为避免使用EF避免返回嵌套对象,请尝试使用Select而不是include(然后可以完全导出所需的内容):

var list = _appContext.TrackingDevices
     .Select(t => new {
         TrackingDevice = t,
         ...
         Asset = Asset,
     });

答案 1 :(得分:0)

这在EF Core中确实很烦人。
我无法完全解决它,但这是一个不完整的解决方案

var list = _appContext.TrackingDevices.Include(td => td.Asset).ToListAsync();
foreach(var l in list)
   l.Asset.TrackingDevice = null;