Sto impazzendo con Entity Framework. Dovrebbe essere più facile e veloce ma è semplicemente orribile.
Sto usando il primo approccio al database con due tabelle molto semplici. La tabella User
con Id
e nome Username
, chiave primaria e autoincremento su Id
e la tabella Permission
con nome permissionname
e Id
userid
, chiave primaria su entrambe le colonne e una relazione da userid
a user.id
Questo è il mio codice per concedere e revocare le autorizzazioni:
public bool ContributionMarginCustomer
{
get => GetPermission(_contributionmarginCustomer);
set => SetPermission(value, _contributionmarginCustomer);
}
La proprietà ContributionMarginCustomer
è associata a una casella di controllo.
private void SetPermission(bool permissionIsGranted, string key)
{
var permissionStatus = permissionIsGranted ? PermissionStatus.Granted : PermissionStatus.Revoked;
using (var entity = new KundeninfoEntities())
{
var user = entity.Users.Single(x => x.Id == _user.Id);
var existingPermission = user.Permissions.SingleOrDefault(x => x.Name == key);
switch (permissionStatus)
{
case PermissionStatus.Granted:
if (existingPermission == null)
{
user.Permissions.Add(new Permission { Name = key });
entity.SaveChanges();
}
break;
case PermissionStatus.Revoked:
if (existingPermission != null)
{
entity.Permissions.Remove(existingPermission);
entity.SaveChanges();
}
break;
}
_permissions = entity.Permissions
.Where(x => x.UserId == _user.Id)
.ToList();
}
}
Concedere un permesso funziona alla grande.
La rimozione dell'autorizzazione con entity.Permission.Remove(existingPermission)
rimuove da ogni singolo utente nel database.
Non capisco questo comportamento. Qualcuno di voi?
Grazie
EDIT: Usertable
Autorizzabile prima:
Autorizzabile dopo averlo rimosso con userId 15 e chiave CONTRIBUTIONMARGINCUSTOMER
Modifica 2: SOLUZIONE
Ho modificato il permesso per avere solo una colonna come chiave primaria. Ciò significa che il nuovo permesso ha tre colonne: Id (autoincrement), Name e UserId con una chiave univoca per nominare e userid.
Il codice sopra funziona ora ma non ne sono davvero contento.
Nel secondo caso, non si sta rimuovendo il permesso dell'utente, ma dall'entità (che è sostanzialmente l'intero elenco di utenti). Cambia in
case PermissionStatus.Revoked:
if (existingPermission != null)
{
user.Permissions.Remove(existingPermission);
entity.SaveChanges();
}
break;