Asp.net-Core

UserManager 引發異常 - 無法跟踪實體,因為主鍵屬性“Id”為空 - 從 .Net Core 2.2 升級到 3.0 後

  • November 6, 2019

我使用了User源自IdentityUserusing的自定義實現Asp.Net Core Identity

public class AppUser : IdentityUser
   {
       ...
   }

如果我呼叫該方法:

var identityResult = await UserManager.CreateAsync(user);

我得到錯誤:

System.InvalidOperationException:無法跟踪“AppUser”類型的實體,因為主鍵屬性“Id”為空。

它與Microsoft.AspNetCore.Identity.EntityFrameworkCore-版本完美配合2.2.0,但升級到3.0.0- 後它不起作用。

在測試使用者創建過程中我也遇到了同樣的錯誤,我使用以下UserManager配置:

https://github.com/aspnet/AspNetCore/blob/c95ee2b051814b787b07f55ff224d03d550aafeb/src/Identity/test/Shared/MockHelpers.cs#L37

EF Core 3.0 引入了重大更改字元串和字節數組鍵預設情況下不是客戶端生成的,這會影響使用stringPK的實體,IdentityUser<string>並且IdentityRole<string>如果未明確設置 PK,則會導致該異常。

但是,還修改了預設值IdentityUser和類以使用內部類建構子填充屬性。所以通常你不應該有這個問題,除非某些程式碼明確設置to 。無論如何,您可以使用連結中的建議切換到舊行為IdentityRole``Id``Guid.NewGuid().ToString()``Id``null

緩解措施

如果沒有設置其他非空值,則可以通過顯式指定鍵屬性應使用生成的值來獲得 3.0 之前的行為。

OnModelCreating例如,在呼叫基本實現之後,在上下文覆蓋中:

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

引用自:https://stackoverflow.com/questions/58729749