Включить в EF Core 2.0 создание бесконечных вложенных дочерних сущностей - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть 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();

Я правильно получаю список устройств отслеживания, которые включают в себя их актив, однако дочерний ресурс снова включает в себя устройство отслеживания, а это, в свою очередь, актив и т. Д., Который создает бесконечную структуру, которая при примененииошибка AutoMapper.

Как я могу включить и получить только те 2 уровня, которые мне нужны?Устройство слежения -> Актив

1 Ответ

0 голосов
/ 11 декабря 2018

То, что вы хотите построить, - это соотношение 1: 1 между вашим активом и устройством отслеживания.Ваш код, если он не настроен должным образом, действительно говорит 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);
}

Пожалуйста, посмотрите здесь , чтобы получить больше информации о том, как это настроить.

Кроме того, чтобы избежать EF, чтобы избежать возврата вложенных объектов, попробуйте использовать Выберите вместо включения (затем вы можете экспортировать именно то, что вам нужно):

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