ASP.NET 5 和 EF - 用 LINQ 替换子列表

Posted

技术标签:

【中文标题】ASP.NET 5 和 EF - 用 LINQ 替换子列表【英文标题】:ASP.NET 5 and EF - Replace child list with LINQ 【发布时间】:2021-12-30 18:48:59 【问题描述】:

我正在为 ASP.NET 项目开发 API 控制器,但遇到了问题。我有一个与服务对象具有一对多关系的计算机对象。添加与数据库中现有计算机具有相同 IP 的计算机时,我想替换旧计算机的属性,以及替换关联的服务集合。但是,当我尝试替换 Services 集合时,它会添加到现有的 Services 中而不是替换它。

计算机模型

public class Computer

    public int ComputerId  get; set; 
    public string Ip  get; set; 
    public string Os  get; set; 
    public IList<Service> Services  get; set; 
        

服务模型

public class Service

    public int ServiceId  get; set; 
    public int ComputerId  get; set; 
    public int Port get; set;
    public int Version get; set;

计算机控制器

[HttpPost]
...
Computer oldComputer = _context.Computers.FirstOrDefault(y => y.Ip == newComputer.Ip);
if(oldComputer != null) 
   oldComputer.Hostname = newComputer.Hostname;
   oldComputer.Os = newComputer.Os;
   oldComputer.Services = newComputer.Services?.ToList(); //this adds new services to old services collection instead of replacing it

为了替换 Services 集合而不是添加到它,我应该进行哪些更改?

【问题讨论】:

【参考方案1】:

您需要加载现有实体,然后清除集合并替换为新实体。

Computer oldComputer = _context.Computers.Include(c => c.Service).FirstOrDefault(y => y.Ip == newComputer.Ip);
if(oldComputer != null) 
   oldComputer.Hostname = newComputer.Hostname;
   oldComputer.Os = newComputer.Os;
   oldComputer.Services.Clear();
   oldComputer.Services = newComputer.Services?.ToList(); //this adds new services to old services collection instead of replacing it

如果您实际上可以执行 upsert 并删除已删除的服务,那么在您的情况下它可能会更有效,但这种模型对我来说并不明显。

【讨论】:

你提到的第二种方法我该怎么做?我更新了服务模型。顺便说一句,你的回答很好。 另外,它似乎适用于第一个 Post 请求,但连续的 post 请求会像以前一样添加到服务中。 这有点复杂。您需要有身份,检查身份何时匹配以更新现有对象,当传入 id 为 0 或您从客户端发送的任何哨兵值时添加,并删除任何在传入列表中未找到的 id。 有些东西可能会保留您的上下文。将其范围限制为每个请求。 对不起,如果这是一个明显的问题,但是否有一个链接解释了如何限制每个请求的范围?

以上是关于ASP.NET 5 和 EF - 用 LINQ 替换子列表的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询

在不使用 LINQ 和 EF 的情况下从 ASP.NET 切换到 ASP MVC

ASP.NET EF 使用LinqPad 快速学习Linq

ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统

ASP.NET中的Linq怎么用?

ASP.NET Mvc开发之EF延迟加载