Unable to track an entity of type because primary key property 'id' is null

19,113

Solution 1

This is due to breaking changes in EF Core 3.0 which can be found under this link:

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#string-and-byte-array-keys-are-not-client-generated-by-default

The problem can be solved by assigning a key manually like this:

// assign GUID to Id
user.Id = Guid.NewGuid().ToString();
var result = await _userManager.CreateAsync(user, password);

Another solution would be the following according to Microsoft:

The pre-3.0 behavior can be obtained by explicitly specifying that the key properties should use generated values if no other non-null value is set. For example, with the fluent API:

modelBuilder
    .Entity<Blog>()
    .Property(e => e.Id)
    .ValueGeneratedOnAdd();

Or with data annotations:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }

Solution 2

This solved the issue for me.

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        var keysProperties = builder.Model.GetEntityTypes().Select(x => x.FindPrimaryKey()).SelectMany(x => x.Properties);
        foreach (var property in keysProperties)
        {
            property.ValueGenerated = ValueGenerated.OnAdd;
        }
    }

Share:
19,113
Tom el Safadi
Author by

Tom el Safadi

Currently studying computer science at the University of Alabama at Birmingham. Working part time as a junior developer for KES-Soft located in Pforzheim, Germany.

Updated on August 02, 2022

Comments

  • Tom el Safadi
    Tom el Safadi almost 2 years

    After I upgraded to Asp.Net Core 3.0 I am getting the following error for my Identity class when attempting to create a user:

    Unable to track an entity 'User' of type because primary key property 'id' is null.

    Here User represents my extension of the Identity model.

    This is the line of code where the error occurs:

    var result = await _userManager.CreateAsync(user, password);