Entity framework EF core 3之后标识栏的变化
在.donet core 2.2中使用EF core版本之前,在执行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
.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中是预期的
是的,它是一个-
建议的解决办法有:
- 不使用存储生成的密钥
- 设置导航属性以形成关系,而不是设置外键值
- 从实体的跟踪信息中获取实际的临时键值。例如,
e将返回临时值,即使context.Entry(blog.Property)(e=>e.Id).CurrentValu
本身尚未设置blog.Id
选项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; }
}