直到.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; }
}
答案 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上下文。