【问题标题】:Remove certain properties from object upon query EF Core 2.1在查询 EF Core 2.1 时从对象中删除某些属性
【发布时间】:2018-09-30 20:36:38
【问题描述】:

在将所有查询的 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);

我找到了一种解决方法,在其中复制对象并将它们返回(不保存到数据库),但我正在寻找更优雅的解决方案。

【问题讨论】:

  • 将它们映射到不具有相关属性的新类的实例?
  • 我就是这么做的。正在寻找更优雅的解决方案。
  • 我最终创建了一个复制构造函数,选择了我想要的字段并返回到本地任务变量。 (未在问题代码中显示)
  • @Irikos:将它们映射到另一个对象是层分离的促成因素。

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


【解决方案1】:

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

【讨论】:

  • 您没有提及它(除非它暗示使用您的结果集作为模板),但您确实意识到您不能以这种方式更新或删除现有实体。作为包含字段子集的模板,我将使用 DTO 对象将数据/业务逻辑与 UI 关注点分开。想到了带有单独客户端的服务器端 WebAPI。
猜你喜欢
  • 1970-01-01
  • 2016-07-01
  • 2020-03-29
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多