EF core 3 之后 IDENTITY 列的变化

Bee*_*ice 3 entity-framework entity-framework-core asp.net-core

直到.donet core 2.2中使用的EF核心版本,在该.Add命令之后,EF用一个大的负数填充key列。

3.0 升级后,这种情况不再发生。

这是代码:

var appointment = new Appointment
{
    Date = DateTime.Today,
    ProfessionalId = schedule.ProfessionalId
};
await service.AddAsync(appointment);

string message = null;
if (service.AddLastPrescription(appointment.Id, schedule.PacienteId))
 ....
Run Code Online (Sandbox Code Playgroud)

问题是现在“appointment.Id”为零,对服务功能的调用将失败(FK 错误)。

这种行为在 3.0 中是预期的?

更新

添加异步函数

private DbSet<T> dbSet;

public async Task AddAsync(T t)
{
    await dbSet.AddAsync(t);
}
Run Code Online (Sandbox Code Playgroud)

其中 T 是 ModelBase:

public class ModelBase
{

    [Key]
    public int Id { get; set; }

    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

这种行为在 3.0 中是预期的?

是的,它是3.0重大更改之一-临时键值不再设置到实体实例上

建议的解决方案有:

  • 不使用商店生成的密钥。
  • 设置导航属性以形成关系而不是设置外键值。
  • 从实体的跟踪信息中获取实际的临时键值。例如,context.Entry(blog).Property(e => e.Id).CurrentValue 将返回临时值,即使它blog.Id本身尚未设置。

选项#1 没有意义(显然受影响的地方已经使用存储生成的密钥)。

如果您有导航属性,则选项 #2 更可取。

选项 #3 更接近于之前的行为,但需要访问 db 上下文。