2017-07-30 7 views
0

Ich versuche, aktuelle Benutzer-ID mit Identität in .NET Core zu erhalten. Verwaltet, um neue Benutzer zu erstellen und sich mit ihm einzuloggen, aber wenn sich mit derselben Benutzeridentität anmelden, wird eine andere GUID zurückgegeben..net Kern Identität Benutzer-ID kommt anders als Datenbank

Ich habe eine Produkteinheit, die userId als Fremdschlüssel speichert. Immer wenn ich versuche, ein neues Produkt hinzuzufügen, löst es einen Fehler aus, weil userId nicht in der Benutzertabelle enthalten ist.

Aber ich registriere einen neuen Benutzer und gehe neues Produkt hinzufügen, sofort funktioniert es. Listet Produkte auf. Abmelden, Abmelden und erneut anmelden mit demselben Benutzer, Produkte sind nicht aufgeführt. Beim Debuggen habe ich gesehen, dass der _userManager.GetUserId(User) einen anderen Wert zurückgibt.

Warum konnte es passieren?

Wie kann ich das beheben?

UPDATE Mein Benutzererstellung-Code

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

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

Mein Benutzer-Login-Code

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

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

Hier ist mein ApplicationUser Model-Klasse

Hier ist mein 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"); 

    } 

Vehicle Creation-Code

[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

Können Sie uns den Code zeigen, der die Daten speichert/abruft? – CodeNotFound

+0

Ich habe die Code-Snippets aus meinem Projekt hinzugefügt. Vielen Dank. – oktykrk

Antwort

0

ein einfaches Experiment Do ... einen neuen Benutzer erstellen und seine Id beachten ... Ab sofort hinzufügen ein Produkt und überprüfen Sie erneut, ob sich die Benutzer-ID nach dem Speichervorgang geändert hat. Es ist möglich, dass die Benutzerdetails beim Speichern geändert/geändert werden. Sie können auch die Codebeispiele zum Erstellen eines Benutzers, zum Erstellen eines Produkts und zum Abrufen eines Benutzers hier einfügen. Das Problem ist höchstwahrscheinlich, wo Sie die Fahrzeuge speichern. Zu diesem Zeitpunkt werden die Benutzerdaten entweder geändert oder die Fahrzeuge werden bei einem anderen Benutzer gespeichert. Das Fahrzeug hat eine 1: 1 Beziehung mit dem Benutzer. Achten Sie also beim Erstellen eines Fahrzeugs darauf, dass Sie es nicht tun. vehicle.user = new User; Stellen Sie sicher, dass Sie Folgendes tun. 1- den Benutzer aus der Db-Adresse:

var user = erwarten UserManager.FindByIdAsync ("Id in aktuell angemeldeten Benutzers");

2- set vehicle.user den Benutzer über Introduction:

vehicle.user = user.

Sie können Code teilen, wo Sie Fahrzeug speichern, damit Leute helfen können. Sie können auch verhindern, dass die Benutzer-ID automatisch in der Datenbank generiert wird, und ein Attribut [Erforderlich] für das Feld Id hinzufügen.Sie können

user.Id = Guid.Guid.NewGuid()

das tun. Dies kann dazu beitragen, Probleme zu vermeiden, bei denen ein neuer Benutzer automatisch zur Datenbank hinzugefügt wird, wenn Sie ein Fahrzeug erstellen.

+0

Ich habe das schon gemacht. Ich erkenne, dass die 'ID' des aktuellen Benutzers nach der Anmeldung von der Datenbank abweicht. Aldo Ich habe die Code-Snippets aus dem Projekt hinzugefügt. Vielen Dank. – oktykrk

+0

Das Problem ist definitiv, wo Sie die Fahrzeuge speichern. Das Fahrzeug hat eine 1: 1 Beziehung mit dem Benutzer. Achten Sie also beim Erstellen eines Fahrzeugs darauf, nicht vehicle.user = new User; –

+0

Ich glaube nicht, dass das Problem ist. Ich erstelle Fahrzeuge, indem ich UserId an das Objekt anschließe. Aber die userId -Eigenschaft wird nicht korrekt angezeigt. Ich bekomme es als _userManager.GetUserId (Benutzer), aber es gibt nie die richtige ID zurück. Der zurückgegebene Wert stimmt niemals mit Primärschlüssel der Datenbank-Benutzertabelle überein. Es gibt nicht einmal eine Aufzeichnung mit dieser ID. – oktykrk