【问题标题】:Changes in IDENTITY column after EF core 3EF core 3 后 IDENTITY 列的变化
【发布时间】:2019-09-28 14:00:23
【问题描述】:

直到 .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; }

}

【问题讨论】:

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


    【解决方案1】:

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

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

    建议的解决方案有:

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

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

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

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

    【讨论】:

    • 不确定context.Entry(blog).Property(e =&gt; e.Id).CurrentValue 究竟是如何工作的?它会从数据库中给出实际的主键值吗?如果是,那么如果同时发生多个插入会发生什么?
    • @Tanvir 它的工作方式与 2.x 中对象 (blog.Id) 的 PK 属性的工作方式相同,即最初将具有临时生成的值。
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 2021-11-18
    • 2020-08-24
    • 2020-02-20
    • 1970-01-01
    • 2016-11-18
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多