我有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个级别? 跟踪设备->资产
答案 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;