2017-07-30 54 views
0

我想在.NET核心中獲取當前用戶的身份標識。管理創建新用戶並用它登錄,但每次用相同的用戶身份登錄時都會返回不同的guid。.net核心身份用戶標識與數據庫有所不同

我有一個產品實體,它存儲userId作爲外鍵。每當我嘗試添加新產品時,都會拋出錯誤,因爲userId不在用戶表中。

但我註冊一個新用戶,並立即添加新產品的工作。列出產品。 Hovewer,註銷並再次用同一用戶登錄,產品未列出。當我調試時看到_userManager.GetUserId(User)返回一個不同的值。

爲什麼會發生?

我該如何解決這個問題?

UPDATE 我的用戶創建代碼

var result = await _userManager.CreateAsync(user, model.Password); 
if (result.Succeeded) 
{ 
    await _signInManager.SignInAsync(user, isPersistent: false); 

    return RedirectToAction(nameof(HomeController.Index), "Home"); 
} 

我的用戶登入碼

var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false); 

if (result.Succeeded) 
{ 
    return RedirectToLocal(returnUrl); 
} 

這裏是我的ApplicationUser模型類

public class ApplicationUser : IdentityUser 
{ 

    [Key] 
    [Column("TABLEID")] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public override string Id { get; set; } 

    [Required] 
    [Column("AD")] 
    public string Name { get; set; } 

    [Required] 
    [Column("SOYAD")] 
    public string Surname { get; set; } 

    [Required] 
    [Column("AKTIF")] 
    public bool IsActive { get; set; } 

    [Required] 
    [Column("SIL")] 
    public bool IsDeleted { get; set; } 

    [Required] 
    [Column("KAYITTARIHI")] 
    public DateTime RecordDate { get; set; } 

    public List<Vehicle> Vehicles { get; set; } 
    public List<VehicleImage> VehicleImages { get; set; } 
    public List<TransportAdvertise> TansportAdvertises { get; set; } 
    public List<TransportRequest> TransportRequests { get; set; } 

} 

這裏是我的DbContext

public DbSet<ApplicationUser> ApplicationUsers { get; set; } 
    public DbSet<Vehicle> Vehicles { get; set; } 
    public DbSet<VehicleImage> VehicleImages { get; set; } 
    public DbSet<TransportAdvertise> TransportAdvertises { get; set; } 
    public DbSet<TransportRequest> TransportRequests { get; set; } 
    public DbSet<TransportRoute> TransportRoutes { get; set; } 
    public DbSet<City> Cities { get; set; } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 

     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 

     // Identity built-in models. 
     builder.Entity<IdentityUser>().ToTable("TBLKULLANICI"); 
     builder.Entity<IdentityRole>().ToTable("TBLROL"); 
     builder.Entity<IdentityUserRole<string>>().ToTable("TBLKULLANICIROL"); 
     builder.Entity<IdentityRoleClaim<string>>().ToTable("TBLROLECLAIM"); 
     builder.Entity<IdentityUserClaim<string>>().ToTable("TBLUSERCLAIM"); 
     builder.Entity<IdentityUserLogin<string>>().ToTable("TBLUSERLOGIN"); 
     builder.Entity<IdentityUserToken<string>>().ToTable("TBLUSERTOKEN"); 

     // Custom models. 
     builder.Entity<Vehicle>().ToTable("TBLARAC"); 
     builder.Entity<VehicleImage>().ToTable("TBLARACRESIM"); 
     builder.Entity<TransportAdvertise>().ToTable("TBLNAKLIYEILAN"); 
     builder.Entity<TransportRequest>().ToTable("TBLNAKLIYEISTEK"); 
     builder.Entity<TransportRoute>().ToTable("TBLROTA"); 
     builder.Entity<City>().ToTable("TBLSEHIR"); 

     // FK mappings.. 
     builder.Entity<Vehicle>() 
       .HasOne(v => v.User) 
       .WithMany(u => u.Vehicles) 
       .HasForeignKey(v => v.UserId) 
       .HasConstraintName("FK_VEHICLE_USER"); 

     // Vehicle image model fks. 
     builder.Entity<VehicleImage>() 
       .HasOne(vi => vi.Vehicle) 
       .WithMany(v => v.Images) 
       .HasForeignKey(vi => vi.VehicleId) 
       .HasConstraintName("FK_VEHICLE_IMAGE_VEHICLE"); 

     builder.Entity<VehicleImage>() 
       .HasOne(vi => vi.User) 
       .WithMany(u => u.VehicleImages) 
       .HasForeignKey(vi => vi.UserId) 
       .HasConstraintName("FK_VEHICLE_IMAGE_USER"); 

     // TransportAdvertise model fks. 
     builder.Entity<TransportAdvertise>() 
       .HasOne(ta => ta.User) 
       .WithMany(u => u.TansportAdvertises) 
       .HasForeignKey(ta => ta.UserId) 
       .HasConstraintName("FK_TRANSPORT_ADS_USER"); 

     builder.Entity<TransportAdvertise>() 
       .HasOne(ta => ta.Vehicle) 
       .WithMany(v => v.TransportAdvertises) 
       .HasForeignKey(ta => ta.VehicleId) 
       .HasConstraintName("FK_TRANSPORT_ADS_VEHICLE"); 

     // TransportRequest model fks. 
     builder.Entity<TransportRequest>() 
       .HasOne(tr => tr.User) 
       .WithMany(u => u.TransportRequests) 
       .HasForeignKey(tr => tr.UserId) 
       .HasConstraintName("FK_TRANSPORT_RQST_USER"); 

     builder.Entity<TransportRequest>() 
       .HasOne(tr => tr.TransportAdvertise) 
       .WithMany(ta => ta.TransportRequests) 
       .HasForeignKey(tr => tr.TransportAdvertiseId) 
       .HasConstraintName("FK_TRANSPORT_RQST_ADS"); 

     // TransportRoute model fks. 
     builder.Entity<TransportRoute>() 
       .HasOne(tr => tr.City) 
       .WithMany(c => c.TransportRoutes) 
       .HasForeignKey(tr => tr.CityId) 
       .HasConstraintName("FK_TRANSPORT_ROUTE_CITY"); 

     builder.Entity<TransportRoute>() 
       .HasOne(tr => tr.TransportAdvertise) 
       .WithMany(ta => ta.TransportRoutes) 
       .HasForeignKey(tr => tr.TransportAdvertiseId) 
       .HasConstraintName("FK_TRANSPORT_ROUTE_ADS"); 

    } 

車輛創建代碼

[HttpPost] 
    public IActionResult AddNewVehicle(VehicleViewModel model) 
    { 
     var id = _userManager.GetUserId(User); 

     // model property check needs to be done before. 
     // vehicle table does not accept nulls. 

     var vehicle = new Vehicle() 
     { 
      Model = model.Model, 
      Capacity = model.Capacity, 
      Description = model.Description, 
      Year = model.Year, 
      Active = true, 
      Delete = false, 
      RecordDate = DateTime.Now, 
      UserId = id 
     }; 

     _vehicleService.AddNew(vehicle); 

     return RedirectToAction("Index"); 
    } 
+0

您能告訴我們保存/檢索數據的代碼嗎? – CodeNotFound

+0

我已經添加了我的項目的代碼片段。謝謝。 – oktykrk

回答

0

做一個簡單的實驗......創建一個新用戶,並記下其編號......立即加入如果在保存操作後用戶標識已更改,請再次檢查產品。用戶的詳細信息可能在保存操作時發生變化/更改。您還可以粘貼代碼示例以創建用戶,創建產品並在此處檢索用戶。問題很可能出在您節省車輛的地方。此時,用戶的詳細信息要麼發生了變化,要麼車輛與其他用戶存儲在一起。車輛與用戶有1對1的關係。因此,在創建車輛時請注意不要做vehicle.user = new User;確保您正在執行以下操作。 1-從DB獲取用戶:

變種用戶=等待UserManager.FindByIdAsync( 「Id的當前 用戶登錄」);

2-組vehicle.user給用戶檢索以上:

vehicle.user =用戶。

您可以共享代碼,以便您可以節省車輛,以便人們能夠提供幫助。此外,您可以防止在數據庫中自動生成用戶ID,並在Id字段中添加[必需的]屬性。你可以在做

user.Id = Guid.Guid.NewGuid()

。這可以幫助防止在您創建車輛時將新用戶自動添加到數據庫的問題

+0

我已經這樣做了。我認識到登錄後當前用戶的'id'與數據庫不同。 Aldo我已經添加了該項目的代碼片段。謝謝。 – oktykrk

+0

問題是你在哪裏節省車輛。車輛與用戶有1對1的關係。所以在創建車輛時要小心不要做vehicle.user = new User; –

+0

我不認爲問題是這樣的。如果我正在通過向用戶提供UserId來創建車輛。但是userId屬性沒有正確顯示。我得到它作爲_userManager.GetUserId(用戶),但它永遠不會返回正確的ID。返回值永遠不會與數據庫用戶表主鍵匹配。這個ID甚至沒有記錄。 – oktykrk