首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EFCore2.0中包含创建无限嵌套子实体

EFCore2.0中包含创建无限嵌套子实体
EN

Stack Overflow用户
提问于 2018-12-11 15:00:42
回答 2查看 1.3K关注 0票数 1

我有两个实体与一对一的关系,模型如下:

代码语言:javascript
复制
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; }
}

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

代码语言:javascript
复制
var list = _appContext.TrackingDevices.Include(td => td.Asset).ToListAsync();

我正确地获得了包含其资产的跟踪设备列表,然而,资产子节点再次包含跟踪设备,这反过来又包括资产等等,这创建了一个无限结构,当应用AutoMapper失败时。

我怎样才能做到包括和只得到我需要的2级?跟踪设备->资产

EN

回答 2

Stack Overflow用户

发布于 2019-10-11 06:09:48

这在EF Core中真的很烦人。

我不能完全解决这个问题,但是这里是一个关于这个问题的解决方案,不是一个完整的解决方案,

代码语言:javascript
复制
var list = _appContext.TrackingDevices.Include(td => td.Asset).ToListAsync();
foreach(var l in list)
   l.Asset.TrackingDevice = null;
票数 1
EN

Stack Overflow用户

发布于 2018-12-11 15:27:23

你想要建立的是你的资产和跟踪设备之间的1比1的关系.如果您的代码配置不正确,您的代码将真正告诉EF Core,您的每个实体都有一个链接到它的实体。

为了让EF核心理解这一点,你需要这样声明你的关系:

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Asset>()
        .HasOne(a => a.TrackingDevice)
        .WithOne(t => t.Asset)
        .HasForeignKey<TrackingDevice>(b => b.AssetId);
}

请看一看这里,以获得更多关于如何设置此设置的信息。

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

代码语言:javascript
复制
var list = _appContext.TrackingDevices
     .Select(t => new {
         TrackingDevice = t,
         ...
         Asset = Asset,
     });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53726850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档