【发布时间】:2018-12-05 09:05:42
【问题描述】:
使用 REST API 的 ASP.NET Core 2 Web 应用程序。目前使用 sqlite3 开发数据库。 (还尝试迁移到 SQL Server 并获得与以下相同的结果)。
我正在向 Web 客户端发送一个实体,客户端对实体进行更改,包括添加一个新的相关实体,然后更新的主体实体在 PUT 请求正文中作为 json 发送回。
我希望自动创建新的相关实体,但这并没有发生。主体实体上的简单属性已正确更新,但引用属性未正确更新。我没有得到任何异常或任何东西 - 它似乎只是忽略了参考属性。
简化类(我删除了其他不应该影响关系的属性):
public partial class DashboardItem {
public int Id { get; set; }
public int? DataObjectId { get; set; }
public DataObject DataObject { get; set; }
}
public partial class DataObject {
public int Id { get; set; }
}
关联属性的 DbContext Fluent API 部分:
modelBuilder.Entity<DashboardItem>(entity => {
entity.HasOne(p => p.DataObject)
.WithMany()
.HasForeignKey(p => p.DataObjectId);
});
PUT 的控制器方法:
[HttpPut("{id}")]
public async Task<IActionResult> PutDashboardItem([FromRoute] int id, [FromBody] DashboardItem entity)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != entity.Id)
{
return BadRequest();
}
_context.Entry(entity).State = EntityState.Modified;
try{
await _context.SaveChangesAsync();
}catch (DbUpdateConcurrencyException)
{
if (!DashboardItemExists(id)){
return NotFound();
}else {
throw;
}
}
return NoContent();
}
简化的 json(没有所有其他属性)看起来像这样(我尝试了不同的变体,将外键“DataObjectId”从 json 中删除,设置为 null,或者设置为零以防万一干扰。):
{
Id:1,
DataObjectId:null,
DataObject:{
Id: 0
}
}
在控制器操作方法中调试时,从请求正文创建的现有“DashboardItem”主体实体在添加到 DbContext 之前填充了引用属性“DataObject”,但不会在数据库中创建新的 DataObject。只有 DashboardItem 发出了 SQL UPDATE 语句,DataObject 没有 INSERT。
我还尝试使用 DbContext.SaveChanges() 而不是 .SaveChangesAsync() 使控制器方法同步而不是异步,因为 used to be a problem 在早期版本的 EF Core 中与创建相关实体相关,甚至虽然我使用的是 2.0,它已经对此进行了修复。结果一样。
This EFCore Doc sounds like it should just work out of the box.
这在之前的项目中对我有用。我在这里错过了什么?
【问题讨论】:
标签: asp.net-core entity-framework-core asp.net-core-2.0 ef-core-2.0