Ho un progetto Core 2.0 che ha raggiunto il punto in cui ho bisogno di iniziare a collegare gli utenti ai dati che ho. È iniziato come un banco di prova per un utente che ora mi richiede di avere più utenti per utente.
Modello utente:
public class ApplicationUser : IdentityUser
{
public virtual ICollection<Balance> Balances { get; set; }
}
Modello di equilibrio:
public virtual ApplicationUser User { get; set; }
...
ApplicationDbContext.cs:
//Users to balances
builder.Entity<ApplicationUser>()
.HasMany(b => b.Balances)
.WithOne(u => u.User);
Nel mio codice, quando creo un nuovo saldo, non riesco a capire come collegare il mio utente attualmente connesso:
var myNewBalance = new Balance();
myNewBalance.User = User;
^ boom
Come posso correlare i saldi con l'utente attualmente connesso?
La proprietà User
che hai evidenziato nella tua domanda è ClaimsPrincipal
che appartiene alla classe ControllerBase
. La proprietà User
sulla classe Balance
è un ApplicationUser
, che non è compatibile con ClaimsPrincipal
. Lo sai già, ma lo sto solo esplicitando per spiegare cosa devi fare.
Poiché stai utilizzando Identità di base ASP.NET qui, puoi utilizzare la classe UserManager
, che è disponibile usando l' UserManager
dipendenze. UserManager
contiene una funzione, GetUserAsync
, che può convertire il tuo ClaimsPrincipal
nel corrispondente ApplicationUser
.
Ecco un codice:
public class SomeController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public SomeController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task<IActionResult> SomeAction()
{
var myNewBalance = new Balance();
myNewBalance.User = await _userManager.GetUserAsync(User);
return View(); // etc, etc.
}
}
I punti chiave sono l'uso del UserManager
generico che utilizza ApplicationUser
e quindi l'invocazione di GetUserAsync
utilizzando la proprietà User
( ClaimsPrincipal
).