Удалить определенные свойства из объекта по запросу EF Core 2.1 - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь обнулить или полностью удалить идентификатор всех запрашиваемых таблиц IsoDataTable перед возвратом их во внешний интерфейс.Идея состоит в том, что он должен вести себя (в данном случае) как шаблон, и я не хочу, чтобы он возвращал мне идентификаторы, и при этом я не хочу, чтобы они удалялись во внешнем интерфейсе.

var applicationType = await _context.ApplicationType
                                    .Include(m => m.IsoTableData)
                                    .AsNoTracking()
                                    .FirstOrDefaultAsync(m => m.Id == id);

if (applicationType == null)
{
    return NotFound();
}

if (applicationType.IsoTableData != null)
{
    foreach (IsoTableData isoTableData in applicationType.IsoTableData)
    {
        // error since it a not nullable primary key
        isoTableData.Id = null;
    }
}

return Ok(applicationType);

Я нашел обходной путь, при котором я дублирую объекты и возвращаю их (без сохранения в БД), но я ищу более элегантное решение.

1 Ответ

0 голосов
/ 30 сентября 2018

То, как я это сделал, было создать конструктор копирования (или, по сути, новый экземпляр объекта) с нужными полями;Я выбрал конструктор копирования, так как эта логика распространена и в других местах.Другое похожее решение - создание объекта DTO, но он мне здесь не нужен.Какие-нибудь улучшения?

//in IsoFileApplicationType.cs
public IsoFileApplicationType(IsoFileApplicationType isoFileApplicationType)
{
    Id = null
    FullName = isoFileApplicationType.FullName;
    Name = isoFileApplicationType.Name;
    (...)


    foreach (IsoTableData isoTableData in isoFileApplicationType.IsoTableData)
    {
        IsoTableData.Add(IsoTableData(isoTableData));
    }
}

//in IsoTableData.cs
public IsoTableData(IsoTableData isoTableData)
{
    Id = null;
    Data = isoTableData.Name;
    Age = isoTableData.Age;
    (...)
}

// in CRUD controller
var applicationType = await _context.ApplicationType
                                   .Include(m => m.IsoTableData)
                                   .AsNoTracking()
                                   .FirstOrDefaultAsync(m => m.Id == id);

if (applicationType == null)
{
    return NotFound();
}
IsoFileApplicationType newIsoFileApplicationType = IsoFileApplicationType(applicationType);
return Ok(newIsoFileApplicationType);
...