Entity framework EF core 3之后标识栏的变化

Entity framework EF core 3之后标识栏的变化,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,在.donet core 2.2中使用EF core版本之前,在执行.Add命令之后,EF会用一个大的负数填充键列 升级3.0后,这种情况不再发生 代码如下: var appointment = new Appointment { Date = DateTime.Today, ProfessionalId = schedule.ProfessionalId }; await service.AddAsync(appointment); string message = null

在.donet core 2.2中使用EF core版本之前,在执行
.Add
命令之后,EF会用一个大的负数填充键列

升级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))
 ....
问题是现在“appointment.Id”为零,对服务函数的调用将失败(FK错误)

这种行为在3.0中是预期的

更新 AddAsync函数

private DbSet<T> dbSet;

public async Task AddAsync(T t)
{
    await dbSet.AddAsync(t);
}
这种行为在3.0中是预期的

是的,它是一个-

建议的解决办法有:

  • 不使用存储生成的密钥
  • 设置导航属性以形成关系,而不是设置外键值
  • 从实体的跟踪信息中获取实际的临时键值。例如,
    context.Entry(blog.Property)(e=>e.Id).CurrentValu
    e将返回临时值,即使
    blog.Id
    本身尚未设置
选项#1没有意义(显然受影响的地方已经使用存储生成的密钥)

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


选项3更接近于前面的行为,但需要访问数据库上下文

不确定
context.Entry(blog).Property(e=>e.Id).CurrentValue
的具体工作方式?它会给出数据库中的实际主键值吗?如果是,那么如果同时发生多个插入,会发生什么?@Tanvir它的工作方式与对象(
blog.Id
)的PK属性在2.x中的工作方式相同,即最初将具有临时生成的值。
public class ModelBase
{

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

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

}