Changes in IDENTITY column after EF core 3 entity-framework entity-framework-core


Until EF core version used in .donet core 2.2, after the .Add command, EF fills the key column with a big negative number.

After 3.0 upgrade this does not happens anymore.

Here is the code:

var appointment = new Appointment
    Date = DateTime.Today,
    ProfessionalId = schedule.ProfessionalId
await service.AddAsync(appointment);

string message = null;
if (service.AddLastPrescription(appointment.Id, schedule.PacienteId))

The problem is that now the "appointment.Id" is zero and the call to the service function will fail (FK error).

This behavior was expected in 3.0?


AddAsync function

private DbSet<T> dbSet;

public async Task AddAsync(T t)
    await dbSet.AddAsync(t);

where T is ModelBase:

public class ModelBase

    public int Id { get; set; }

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

9/28/2019 2:14:13 PM

Accepted Answer

This behavior was expected in 3.0?

Yes, it is one of the 3.0 Breaking Changes - Temporary key values are no longer set onto entity instances.

The proposed solutions there are:

  • Not using store-generated keys.
  • Setting navigation properties to form relationships instead of setting foreign key values.
  • Obtain the actual temporary key values from the entity's tracking information. For example, context.Entry(blog).Property(e => e.Id).CurrentValue will return the temporary value even though blog.Id itself hasn't been set.

Option #1 doesn't make sense (apparently the affected places already use store generated keys).

Option #2 is preferable if you have navigation properties.

Option #3 is closer to the previous behavior, but requires access to the db context.

9/28/2019 2:13:50 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow