修改从 Entity Framework Core 返回的本地实体后,为啥我的执行消失了?

Posted

技术标签:

【中文标题】修改从 Entity Framework Core 返回的本地实体后,为啥我的执行消失了?【英文标题】:Why does my execution dissapear after modifying a local entity returned from Entity Framework Core?修改从 Entity Framework Core 返回的本地实体后,为什么我的执行消失了? 【发布时间】:2017-09-01 19:52:08 【问题描述】:

我在 ASP.Net Core MVC 中有一个 Web API 控制器。

看起来像这样:

namespace Hrsa.Core.Web.App.Controllers.Api

    [Route("api/[controller]")]
    public class CasesController : Controller
    
        private readonly IGenericService<Case> _caseGenericService;

        public CasesController(IGenericService<Case> caseGenericService)
        
            _caseGenericService = caseGenericService;
        

        [HttpPost]
        public async Task<Case> AddCase([FromBody] EmployeeCaseFromBodyModel model)
        
            Case employeeCase = new Case()
            
                InitalConsultDate = model.InitialConsultDate,
            ;

            Case newCase = await _caseGenericService.InsertAsync(employeeCase);
            EmployeeCase empToCase = new EmployeeCase
            
                CaseId = newCase.Id,
                EmployeeId = model.EmployeeId
            ;
            newCase.EmployeeCases.Add(empToCase);
            await _caseGenericService.UpdateAsync(newCase);
            return newCase;
        

    

我从通用服务中取回了我的新案例。 我的新案例有一个新生成的 id。太好了。

现在我创建一个新的 EmployeeCase 记录,其中包含我新生成的案例的 ID 和我想要添加案例的员工 ID。

现在我尝试简单地将 Employee 案例记录添加到 EmployeeCases 集合中。

但执行只是被吞没并消失了。 我在输出窗口中得到一堆线程退出行。

The thread 0x2128 has exited with code 0 (0x0).
The thread 0x2e38 has exited with code 0 (0x0).
The thread 0x2d5c has exited with code 0 (0x0).
The thread 0x2d44 has exited with code 0 (0x0).
The thread 0x2658 has exited with code 0 (0x0).

一旦实体框架插入并返回了新案例,newCase 变量不是局部变量吗? 我不应该像这样修改它吗?

执行在哪里? 在调试时,当我进入下一行时,它只会让我永远退出线程并且永远不会进入下一行。

实体是否仍能以某种方式附加到 dbContext 而不会被释放? 这就是它不允许我在本地使用它的原因吗?

我想我可以像这样在本地修改它,然后在将 EmployeeCase 记录添加到它之后发送整个实体以进行更新。 但它在到达更新行之前就被吞没了。

更新 1:

现在我在输出窗口中看到所有“线程 nnn 已以代码 0 退出”行之前:

Exception thrown: 'System.NullReferenceException' in Hrsa.Core.Web.App.dll

所以这一行中有些东西是空的:

newCase.EmployeeCases.Add(empToCase);

但我不知道是什么。

【问题讨论】:

【参考方案1】:

问题是当我尝试添加到列表时,newCase 的 EmployeeCases 列表仍然为空。

我添加了这一行:

newCase.EmployeeCases = new List<EmployeeCase>();

完成 HttpPost:

    [HttpPost]
    public async Task<Case> AddCase([FromBody] EmployeeCaseFromBodyModel model)
    
        Case employeeCase = new Case()
        
            // LerSpecialistId = model.LerSpecialistId,
            // InitialContactId = model.InitialContactId,
            InitalConsultDate = model.InitialConsultDate,
            // Notes = model.Notes
        ;

        Case newCase = await _caseGenericService.InsertAsync(employeeCase);

        newCase.EmployeeCases = new List<EmployeeCase>();
        newCase.EmployeeCases.Add(new EmployeeCase
            
                CaseId = newCase.Id,
                EmployeeId = model.EmployeeId
            
        );
        await _caseGenericService.UpdateAsync(newCase);
        return newCase;
    

【讨论】:

以上是关于修改从 Entity Framework Core 返回的本地实体后,为啥我的执行消失了?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 7中高效地进行批量数据插入

Entity Framework Core 迁移命令

从 Entity Framework Core 的导航属性中选择对象列表

Entity Framework Core 中的动态数据模型

从 Entity Framework Core IQueryable<T> 获取 SQL 代码

Entity Framework Core 删除包含已读取实体的实体