EF核心3之后的IDENTITY列中的更改

时间:2019-09-28 14:00:23

标签: entity-framework asp.net-core entity-framework-core

直到.donet core 2.2中使用的EF核心版本,在执行.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);
}

其中T是ModelBase:

public class ModelBase
{

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

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

}

1 个答案:

答案 0 :(得分:1)

  

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

是的,它是3.0 Breaking Changes-Temporary key values are no longer set onto entity instances之一。

建议的解决方案有:

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

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

如果具有导航属性,则最好使用选项2。

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