c# - 将 EF Core 2.1 升级到 3.1 后如何使用“SaveChanges”
问题描述
- 我发现将 EFCore 从 2.1 升级到 3.1 后,“SaveChanges”的行为发生了变化:
- 在创建场景中无法正确设置外键以形成实体之间的关联,并且似乎与此重大更改有关。**“临时键值不再设置到实体实例上”**
- 这是我的代码片段,它只是简单地创建了一个新的 A 实体和 B 实体,A 和 B 之间存在一对多的关系,B 具有导航属性“A_Id”并在 AutoMapp 类中声明 DB 约束。
public class A
{
public long Id { get; set; }
}
public class B
{
public long a_Id { get;set; }
public A a { get;set; }
}
public class BMap
{
builder.HasForeignKey(x => x.A_Id)
.HasConstraintName("FK_dbo.B_dbo.A_AId");
}
using (var context = _contextFactory.Create())
{
A a;
if (aDto.IsTransient)
{
a = context.AttachAsAdded<ADto>(aDto);
}
//await context.SaveChangesAsync();
foreach (var bId in aDto.bIds)
{
context.AttachAsAdded(new B { a_Id = a.Id });
}
await context.SaveChangesAsync();
}
public TEntity AttachAsAdded<TEntity>(SimpleEntity dto)
where TEntity : Entity, new()
{
var autoDetectChangesEnabled = ChangeTracker.AutoDetectChangesEnabled;
ChangeTracker.AutoDetectChangesEnabled = false;
var entity = new TEntity();
var entry = Entry(entity);
entry.CurrentValues.SetValues(dto);
entry.State = EntityState.Added;
ChangeTracker.AutoDetectChangesEnabled = autoDetectChangesEnabled;
return entity;
}
- 事实上,EFCore 将尝试通过分配外键 (a_Id) 来执行 SQL,因为它是 a.Id 的初始值,它是一个负数。
- 在我的情况下它会引发异常:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.B_dbo.A_AId". The conflict occurred in database "XXXX", table "dbo.A", column 'Id'. The statement has been terminated.”
作为一种解决方法,我通过在使用 DB 生成的值之前执行“SaveChangeAsync”来解决它。(上面的注释行)
如果有任何其他方法可以解决它,请帮助我。非常感谢。
解决方案
推荐阅读
- reactjs - 将 React Navigation 传递给子组件的子组件
- python - 将按钮的大小调整为小于 1 像素,例如 (0.5)
- php - symfony 测试 app.user 在树枝中为空
- java - 如何在 JPanel 上显示 45 秒的倒数计时器。我该怎么做?
- java - Liferay 6.1 TLSv1.2 可以吗?
- docker - 无法连接到在 Windows 上使用 docker-compose 启动的容器的公开端口
- sql - 得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句
- javascript - laravel 中的 API 和 Vue js
- ios - 当页面在 Ionic Framework 中以编程方式切换时,它会破坏该页面吗?
- javascript - 如何在正在测试的组件中模拟 util 函数