在查询EF Core 2.1时从对象中删除某些属性

时间:2018-09-29 18:17:59

标签: c# entity-framework entity-framework-core ef-fluent-api ef-core-2.1

我正在尝试将所有查询的IsoDataTables的ID完全清空或完全删除,然后再将其返回到前端。这个想法是(在这种情况下)它应该作为模板,并且我不希望它将ID返回给我,也不希望它们在前端被删除。

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 :(得分:0)

我做的方法是创建一个带有所需字段的副本构造函数(或者基本上是一个对象的新实例)。我选择了一个拷贝构造函数,因为这种逻辑在其他地方也同样适用。另一个类似的解决方案是创建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);