2017-07-30 10 views
0

.NETコアで現在のユーザーIDをIDで取得しようとしています。新しいユーザーを作成してログインするように管理されていますが、同じユーザーIDでログインすると異なるGUIDが返されます。.netコアIDユーザーIDがデータベースと異なる場合

私は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

簡単な実験...新しいユーザーを作成し、そのIDを注意してください...すぐに追加を実行します。ユーザーIDが保存操作後に変更されたかどうかを再度確認してください。セーブ操作時にユーザーの詳細が変更/変更されている可能性があります。また、ユーザーを作成し、製品を作成し、ここでユーザーを取得するためのコードサンプルを貼り付けることもできます。問題は、あなたが車を救っている場所である可能性が最も高いです。その時点で、ユーザーの詳細が変更されているか、または車両が別のユーザーと一緒に保管されています。車両は、ユーザと1対1の関係にあります。だから車を作るときにはしないように注意してくださいvehicle.user = new User;次のことをしていることを確認してください。 の1- DBからユーザーを取得します。

VARユーザー=がUserManager.FindByIdAsync待つ( "現在 ログインしているユーザーのIDを"); =ユーザ

vehicle.user:上記検索ユーザに

2-セットvehicle.user。

あなたが助けることができる人々のために、あなたが乗り物を保存している場所でコードを共有することができます。また、ユーザーIDがdb内で自動的に生成されるのを防ぎ、Idフィールドに[必須]属性を追加することもできます。あなたは

user.Id = Guid.Guid.NewGuid()

を行うことができます。これは、新しいユーザーが車両を作成するときにdbに自動的に追加される問題を防ぐのに役立ちます。

+0

私はすでにこれを行っています。現在のユーザーのIDがログイン後にデータベースと異なることを認識しています。 Aldoプロジェクトからコードスニペットを追加しました。ありがとうございました。 – oktykrk

+0

問題は間違いなくどこに車を保存しているのですか?車両は、ユーザと1対1の関係にあります。だから、車両を作るときは、vehicle.user = new Userをやっていないように注意してください。 –

+0

私は問題はそれだとは思わない。 Becouse私はUserIdをオブジェクトにアタッチしてVehiclesを作成しています。しかし、userIdプロパティは正しく来ません。 _userManager.GetUserId(User)として取得していますが、正しいIDが返されることはありません。返された値は、データベースUserテーブルの主キーと決して一致しません。そのidのレコードさえありません。 – oktykrk

関連する問題