Merge pull request #12026 from abpframework/EngincanV/docs-concurrency-check

Docs: Concurrency Check & `IHasConcurrencyStamp` Interface
pull/12119/head
Engincan VESKE 4 years ago committed by GitHub
commit 6c8007e07f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,3 +1,147 @@
## Concurrency Check
TODO
### Introduction
Concurrency Check (also known as **Concurrency Control**) refers to specific mechanisms used to ensure data consistency in the presence of concurrent changes (multiple processes, users access or change the same data in a database at the same time).
There are two commonly used concurrency control mechanisms/approaches:
* **Optimistic Concurrency Control**: Optimistic Concurrency Control allows multiple users to attempt to **update** the same record without informing the users that others are also attempting to **update** it.
* If a user successfully updates the record, the other users need to get the latest changes for the current record to be able to make changes.
* ABP's concurrency check system uses the **Optimistic Concurrency Control**.
* **Pessimistic Concurrency Control**: Pessimistic Concurrency Control prevents simultaneous updates to records and uses a locking mechanism. For more information please see [here](https://www.martinfowler.com/eaaCatalog/pessimisticOfflineLock.html).
### Usage
#### `IHasConcurrencyStamp` Interface
To enable **concurrency control** to your entity class, you should implement the `IHasConcurrencyStamp` interface, directly or indirectly.
```csharp
public interface IHasConcurrencyStamp
{
public string ConcurrencyStamp { get; set; }
}
```
* It is the base interface for **concurrency control** and only has a simple property named `ConcurrencyStamp`.
* While a new record is **creating**, if the entity implements the `IHasConcurrencyStamp` interface, ABP Framework automatically sets a unique value to the **ConcurrencyStamp** property.
* While a record is **updating**, ABP Framework compares the **ConcurrencyStamp** property of the entity with the provided **ConcurrencyStamp** value by the user and if the values match, it automatically updates the **ConcurrencyStamp** property with the new unique value. If there is a mismatch, `AbpDbConcurrencyException` is thrown.
**Example: Applying Concurrency Control for the Book Entity**
Implement the `IHasConcurrencyStamp` interface for your entity:
```csharp
public class Book : Entity<Guid>, IHasConcurrencyStamp
{
public string ConcurrencyStamp { get; set; }
//...
}
```
Also, implement your output and update the DTO classes from the `IHasConcurrencyStamp` interface:
```csharp
public class BookDto : EntityDto<Guid>, IHasConcurrencyStamp
{
//...
public string ConcurrencyStamp { get; set; }
}
public class UpdateBookDto : IHasConcurrencyStamp
{
//...
public string ConcurrencyStamp { get; set; }
}
```
Set the **ConcurrencyStamp** input value to the entity in the **UpdateAsync** method of your application service, for that purpose you can use the `SetConcurrencyStampIfNotNull` method as below:
```csharp
public class BookAppService : ApplicationService, IBookAppService
{
//...
public virtual async Task<BookDto> UpdateAsync(Guid id, UpdateBookDto input)
{
var book = await BookRepository.GetAsync(id);
book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
//set other input values to the entity ...
await BookRepository.UpdateAsync(book);
}
}
```
* After that, when multiple users try to update the same record at the same time, the concurrency stamp mismatch occurs and `AbpDbConcurrencyException` is thrown.
#### Base Classes
[Aggregate Root](./Entities.md#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface. So, if you are deriving from one of these base classes, you don't need to manually implement the `IHasConcurrencyStamp` interface:
- `AggregateRoot`, `AggregateRoot<TKey>`
- `CreationAuditedAggregateRoot`, `CreationAuditedAggregateRoot<TKey>`
- `AuditedAggregateRoot`, `AuditedAggregateRoot<TKey>`
- `FullAuditedAggregateRoot`, `FullAuditedAggregateRoot<TKey>`
**Example: Applying Concurrency Control for the Book Entity**
You can inherit your entity from one of [the base classes](#base-classes):
```csharp
public class Book : FullAuditedAggregateRoot<Guid>
{
//...
}
```
Then, you can implement your output and update the DTO classes from the `IHasConcurrencyStamp` interface:
```csharp
public class BookDto : EntityDto<Guid>, IHasConcurrencyStamp
{
//...
public string ConcurrencyStamp { get; set; }
}
public class UpdateBookDto : IHasConcurrencyStamp
{
//...
public string ConcurrencyStamp { get; set; }
}
```
Set the **ConcurrencyStamp** input value to the entity in the **UpdateAsync** method of your application service, for that purpose you can use the `SetConcurrencyStampIfNotNull` method as below:
```csharp
public class BookAppService : ApplicationService, IBookAppService
{
//...
public virtual async Task<BookDto> UpdateAsync(Guid id, UpdateBookDto input)
{
var book = await BookRepository.GetAsync(id);
book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
//set other input values to the entity ...
await BookRepository.UpdateAsync(book);
}
}
```
After that, when multiple users try to update the same record at the same time, the concurrency stamp mismatch occurs and `AbpDbConcurrencyException` is thrown. You can either handle the exception manually or let the ABP Framework handle it for you.
ABP Framework shows a user-friendly error message as in the image below, if you don't handle the exception manually.
![Optimistic Concurrency](./images/optimistic-concurrency.png)

@ -284,10 +284,18 @@
}
]
},
{
"text": "Cancellation Token Provider",
"path": "Cancellation-Token-Provider.md"
},
{
"text": "CSRF/XSRF & Anti Forgery",
"path": "CSRF-Anti-Forgery.md"
},
{
"text": "Concurrency Check",
"path": "Concurrency-Check.md"
},
{
"text": "Current User",
"path": "CurrentUser.md"
@ -317,10 +325,6 @@
}
]
},
{
"text": "SMS Sending",
"path": "SMS-Sending.md"
},
{
"text": "Event Bus",
"items": [
@ -356,10 +360,6 @@
}
]
},
{
"text": "JSON",
"path": "JSON.md"
},
{
"text": "Features",
"path": "Features.md"
@ -372,10 +372,22 @@
"text": "GUID Generation",
"path": "Guid-Generation.md"
},
{
"text": "JSON",
"path": "JSON.md"
},
{
"text": "Object to Object Mapping",
"path": "Object-To-Object-Mapping.md"
},
{
"text": "Simple State Checker",
"path": "SimpleStateChecker.md"
},
{
"text": "SMS Sending",
"path": "SMS-Sending.md"
},
{
"text": "String Encryption",
"path": "String-Encryption.md"
@ -401,14 +413,6 @@
{
"text": "Virtual File System",
"path": "Virtual-File-System.md"
},
{
"text": "Cancellation Token Provider",
"path": "Cancellation-Token-Provider.md"
},
{
"text": "Simple State Checker",
"path": "SimpleStateChecker.md"
}
]
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@ -37,7 +37,7 @@
"PasswordChangedMessage": "تم تغيير كلمة مرورك بنجاح.",
"PersonalSettingsSavedMessage": "تم حفظ إعداداتك الشخصية بنجاح.",
"Volo.Abp.Identity:DefaultError": "حدث خطأ.",
"Volo.Abp.Identity:ConcurrencyFailure": "فشل التزامن المتفائل ، تم تعديل الكائن.",
"Volo.Abp.Identity:ConcurrencyFailure": "فشل التحقق من التزامن المتفائل. تم تعديل الكيان الذي تعمل عليه بواسطة مستخدم آخر. الرجاء تجاهل التغييرات الخاصة بك وحاول مرة أخرى.",
"Volo.Abp.Identity:DuplicateEmail": "البريد الإلكتروني '{0}' مستخدم بالفعل.",
"Volo.Abp.Identity:DuplicateRoleName": "اسم الدور '{0}' مأخوذ بالفعل.",
"Volo.Abp.Identity:DuplicateUserName": "اسم المستخدم '{0}' مأخوذ بالفعل.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Vaše heslo bylo úspěšně změněno.",
"PersonalSettingsSavedMessage": "Vaše osobní nastavení bylo úspěšně uloženo.",
"Volo.Abp.Identity:DefaultError": "Došlo k neznámé chybě.",
"Volo.Abp.Identity:ConcurrencyFailure": "Selhání optimistické souběžnosti, objekt byl změněn.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistická kontrola souběžnosti se nezdařila. Entita, na které pracujete, byla změněna jiným uživatelem. Zahoďte změny a zkuste to znovu.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' již existuje.",
"Volo.Abp.Identity:DuplicateRoleName": "Role '{0}' již existuje.",
"Volo.Abp.Identity:DuplicateUserName": "Uživatelské jméno '{0}' již existuje.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.",
"Volo.Abp.Identity:DefaultError": "Ein unbekannter Fehler ist aufgetreten.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimitic Concurrency-Fehler, Objekt wurde geändert.",
"Volo.Abp.Identity:ConcurrencyFailure": "Die optimistische Gleichzeitigkeitsprüfung ist fehlgeschlagen. Die Entität, an der Sie arbeiten, wurde von einem anderen Benutzer geändert. Bitte verwerfen Sie Ihre Änderungen und versuchen Sie es erneut.",
"Volo.Abp.Identity:DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.",
"Volo.Abp.Identity:DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.",
"Volo.Abp.Identity:DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.",

@ -36,7 +36,7 @@
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.",
"Volo.Abp.Identity:DefaultError": "Ein unbekannter Fehler ist aufgetreten.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.",
"Volo.Abp.Identity:ConcurrencyFailure": "Die optimistische Gleichzeitigkeitsprüfung ist fehlgeschlagen. Die Entität, an der Sie arbeiten, wurde von einem anderen Benutzer geändert. Bitte verwerfen Sie Ihre Änderungen und versuchen Sie es erneut.",
"Volo.Abp.Identity:DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.",
"Volo.Abp.Identity:DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.",
"Volo.Abp.Identity:DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.",

@ -36,7 +36,7 @@
"PasswordChangedMessage": "Your password has been changed successfully.",
"PersonalSettingsSavedMessage": "Your personal settings has been saved successfully.",
"Volo.Abp.Identity:DefaultError": "An unknown failure has occurred.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency check has been failed. The entity you're working on has modified by another user. Please discard your changes and try again.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' is already taken.",
"Volo.Abp.Identity:DuplicateRoleName": "Role name '{0}' has already been taken.",
"Volo.Abp.Identity:DuplicateUserName": "Username '{0}' has already been taken.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Your password has been changed successfully.",
"PersonalSettingsSavedMessage": "Your personal settings has been saved successfully.",
"Volo.Abp.Identity:DefaultError": "An unknown failure has occurred.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency check has been failed. The entity you're working on has modified by another user. Please discard your changes and try again.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' is already taken.",
"Volo.Abp.Identity:DuplicateRoleName": "Role name '{0}' is already taken.",
"Volo.Abp.Identity:DuplicateUserName": "Username '{0}' is already taken.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Tu contraseña ha sido cambiada satisfactoriamente.",
"PersonalSettingsSavedMessage": "Tu configuración personal ha sido guardada satisfactoriamente.",
"Volo.Abp.Identity:DefaultError": "Error desconocido.",
"Volo.Abp.Identity:ConcurrencyFailure": "Fallo de concurrencia optimista",
"Volo.Abp.Identity:ConcurrencyFailure": "Se ha producido un error en la comprobación de simultaneidad optimista. La entidad en la que está trabajando ha sido modificada por otro usuario. Descarte los cambios y vuelva a intentarlo.",
"Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' está en uso.",
"Volo.Abp.Identity:DuplicateRoleName": "El nombre de rol '{0}' ya está en uso.",
"Volo.Abp.Identity:DuplicateUserName": "El nombre de usuario '{0}' ya está en uso.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Salasanasi on vaihdettu onnistuneesti.",
"PersonalSettingsSavedMessage": "Henkilökohtaiset asetuksesi on tallennettu.",
"Volo.Abp.Identity:DefaultError": "Tuntematon vika on tapahtunut.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistinen samanaikaisuuden epäonnistuminen, kohdetta on muokattu.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistinen samanaikaisuuden tarkistus epäonnistui. Toinen käyttäjä on muokannut entiteettiä, jonka parissa työskentelet. Hylkää muutokset ja yritä uudelleen.",
"Volo.Abp.Identity:DuplicateEmail": "Sähköposti {0} on jo otettu.",
"Volo.Abp.Identity:DuplicateRoleName": "Roolin nimi {0} on jo otettu.",
"Volo.Abp.Identity:DuplicateUserName": "Käyttäjätunnus {0} on jo otettu.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Votre mot de passe a été modifié avec succès.",
"PersonalSettingsSavedMessage": "Vos paramètres personnels ont été enregistrés avec succès.",
"Volo.Abp.Identity:DefaultError": "Une défaillance inconnue sest produite.",
"Volo.Abp.Identity:ConcurrencyFailure": "Échec optimiste de la concurrence, lobjet a été modifié.",
"Volo.Abp.Identity:ConcurrencyFailure": "La vérification de la simultanéité optimiste a échoué. L'entité sur laquelle vous travaillez a été modifiée par un autre utilisateur. Veuillez annuler vos modifications et réessayer.",
"Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' est déjà prise.",
"Volo.Abp.Identity:DuplicateRoleName": "Le nom de rôle '{0}' est déjà pris.",
"Volo.Abp.Identity:DuplicateUserName": "Le nom dutilisateur '{0}' est déjà pris.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "तुम्हारा पासवर्ड सफलतापूर्वक बदल दिया गया है।",
"PersonalSettingsSavedMessage": "आपकी व्यक्तिगत सेटिंग्स सफलतापूर्वक सहेज ली गई हैं।",
"Volo.Abp.Identity:DefaultError": "एक अज्ञात विफलता हुई है।",
"Volo.Abp.Identity:ConcurrencyFailure": "आशावादी संगरोध विफलता, ऑब्जेक्ट संशोधित किया गया है।",
"Volo.Abp.Identity:ConcurrencyFailure": "आशावादी समवर्ती जाँच विफल हो गई है। आप जिस निकाय पर काम कर रहे हैं, उसे किसी अन्य उपयोगकर्ता द्वारा संशोधित किया गया है। कृपया अपने परिवर्तन त्यागें और पुनः प्रयास करें।",
"Volo.Abp.Identity:DuplicateEmail": "ईमेल '{0}' पहले से ही लिया गया है।",
"Volo.Abp.Identity:DuplicateRoleName": "भूमिका नाम '{0}' पहले से ही लिया गया है।",
"Volo.Abp.Identity:DuplicateUserName": "उपयोगकर्ता नाम '{0}' पहले से ही लिया गया है।",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Jelszavát sikeresen megváltoztattuk.",
"PersonalSettingsSavedMessage": "Személyes beállításait sikeresen mentette.",
"Volo.Abp.Identity:DefaultError": "Ismeretlen hiba történt.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimista párhuzamossági hiba, az objektum módosult.",
"Volo.Abp.Identity:ConcurrencyFailure": "Az optimista párhuzamosság-ellenőrzés sikertelen. Az entitást, amelyen dolgozik, egy másik felhasználó módosította. Kérjük, dobja el a módosításokat, és próbálja újra.",
"Volo.Abp.Identity:DuplicateEmail": "Az '{0}' email cím már foglalt.",
"Volo.Abp.Identity:DuplicateRoleName": "Szerepkör neve '{0}' foglalt.",
"Volo.Abp.Identity:DuplicateUserName": "'{0}' felahsználónév foglalt.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Lykilorðinu þínu hefur verið breytt.",
"PersonalSettingsSavedMessage": "Stillingarnar þínar hafa verið vistaðar",
"Volo.Abp.Identity:DefaultError": "Óþekkt villa hefur komið upp.",
"Volo.Abp.Identity:ConcurrencyFailure": "Bjartsýn samhliða bilun, hlut hefur verið breytt.",
"Volo.Abp.Identity:ConcurrencyFailure": "Bjartsýn samhliðaskoðun hefur mistekist. Einingin sem þú ert að vinna á hefur breytt af öðrum notanda. Vinsamlegast fargaðu breytingunum og reyndu aftur.",
"Volo.Abp.Identity:DuplicateEmail": "Netfang '{0}' er nú þegar í notkun.",
"Volo.Abp.Identity:DuplicateRoleName": "Hlutverkanafn '{0}' nú þegar til.",
"Volo.Abp.Identity:DuplicateUserName": "Notandanafn '{0}' er nú þegar í notkun.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "La tua password è stata modificata con successo.",
"PersonalSettingsSavedMessage": "Le tue impostazioni personali sono state salvate con successo.",
"Volo.Abp.Identity:DefaultError": "Si è verificato un errore sconosciuto.",
"Volo.Abp.Identity:ConcurrencyFailure": "Errore di concorrenza ottimistica, l'oggetto è stato modificato.",
"Volo.Abp.Identity:ConcurrencyFailure": "Il controllo della concorrenza ottimistica non è riuscito. L'entità su cui stai lavorando è stata modificata da un altro utente. Annulla le modifiche e riprova.",
"Volo.Abp.Identity:DuplicateEmail": "L'email '{0}' è già stata accettata.",
"Volo.Abp.Identity:DuplicateRoleName": "Il nome del ruolo '{0}' è già stato utilizzato.",
"Volo.Abp.Identity:DuplicateUserName": "Il nome utente '{0}' è già in uso.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Uw wachtwoord is met succes veranderd.",
"PersonalSettingsSavedMessage": "Uw persoonlijke instellingen zijn succesvol opgeslagen.",
"Volo.Abp.Identity:DefaultError": "Er is een onbekende fout opgetreden.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistische gelijktijdigheidsfout, object is al gewijzigd.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistische gelijktijdigheidscontrole is mislukt. De entiteit waaraan u werkt, is gewijzigd door een andere gebruiker. Negeer uw wijzigingen en probeer het opnieuw.",
"Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' is al in gebruik.",
"Volo.Abp.Identity:DuplicateRoleName": "De rol naam '{0}' is al in gebruik.",
"Volo.Abp.Identity:DuplicateUserName": "Gebruikersnaam '{0}' is al in gebruik.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Twoje hasło zostało zmienione pomyślnie.",
"PersonalSettingsSavedMessage": "Twoje personalne ustawienia zostały zapisane pomyślnie.",
"Volo.Abp.Identity:DefaultError": "Wystąpił niespodziewany błąd.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optymistyczny błąd współbierzności, obiekt został zmodyfikowany.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optymistyczne sprawdzenie współbieżności nie powiodło się. Jednostka, nad którą pracujesz, została zmodyfikowana przez innego użytkownika. Odrzuć zmiany i spróbuj ponownie.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' już istnieje.",
"Volo.Abp.Identity:DuplicateRoleName": "Rola '{0}' już istnieje.",
"Volo.Abp.Identity:DuplicateUserName": "Nazwa użytkownika '{0}' już istnieje.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Sua senha foi alterada com sucesso.",
"PersonalSettingsSavedMessage": "Suas configurações pessoais foram salvas com sucesso.",
"Volo.Abp.Identity:DefaultError": "Ocorreu uma falha desconhecida.",
"Volo.Abp.Identity:ConcurrencyFailure": "Falha de concorrência otimista, o objeto foi modificado.",
"Volo.Abp.Identity:ConcurrencyFailure": "A verificação de simultaneidade otimista falhou. A entidade em que você está trabalhando foi modificada por outro usuário. Por favor, descarte suas alterações e tente novamente.",
"Volo.Abp.Identity:DuplicateEmail": "O e-mail '{0}' já está em uso.",
"Volo.Abp.Identity:DuplicateRoleName": "O nome de perfil '{0}' já está em uso.",
"Volo.Abp.Identity:DuplicateUserName": "O usuário '{0}' já está em uso.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Parola dumneavoastră a fost schimbată cu succes.",
"PersonalSettingsSavedMessage": "Setările personale ale dumneavoastră au fost salvate cu succes.",
"Volo.Abp.Identity:DefaultError": "A intervenit o eroare neaşteptată.",
"Volo.Abp.Identity:ConcurrencyFailure": "Eşec concurenţial optimist, obiectul a fost modificat.",
"Volo.Abp.Identity:ConcurrencyFailure": "Verificarea optimistă a concurenței a eșuat. Entitatea la care lucrați a fost modificată de un alt utilizator. Vă rugăm să renunțați la modificări și să încercați din nou.",
"Volo.Abp.Identity:DuplicateEmail": "Emailul '{0}' este deja luat.",
"Volo.Abp.Identity:DuplicateRoleName": "Numele de rol '{0}' este deja luat.",
"Volo.Abp.Identity:DuplicateUserName": "Numele de utilizator '{0}' este deja luat.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Ваш пароль был успешно изменен.",
"PersonalSettingsSavedMessage": "Ваши персональные настройки были успешно сохранены.",
"Volo.Abp.Identity:DefaultError": "Возникла непредвиденная ошибка.",
"Volo.Abp.Identity:ConcurrencyFailure": "Ошибка оптимального управления многопоточностью, объект был изменен.",
"Volo.Abp.Identity:ConcurrencyFailure": "Проверка оптимистического параллелизма не удалась. Объект, над которым вы работаете, был изменен другим пользователем. Отмените изменения и повторите попытку.",
"Volo.Abp.Identity:DuplicateEmail": "Электронная почта '{0}' уже зарегистрирована.",
"Volo.Abp.Identity:DuplicateRoleName": "Имя роли '{0}' уже занято.",
"Volo.Abp.Identity:DuplicateUserName": "Имя пользователя '{0}' уже занято.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Vaše heslo bolo úspešne zmenené.",
"PersonalSettingsSavedMessage": "Vaše osobné nastavenia boli úspešne uložené.",
"Volo.Abp.Identity:DefaultError": "Došlo k neznámej chybe.",
"Volo.Abp.Identity:ConcurrencyFailure": "Zlyhanie v dôsledku súbežných akcií, objekt už bol upravený.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistická kontrola súbežnosti zlyhala. Entita, na ktorej pracujete, bola upravená iným používateľom. Zahoďte zmeny a skúste to znova.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' sa už používa.",
"Volo.Abp.Identity:DuplicateRoleName": "Názov roly '{0}' sa už používa.",
"Volo.Abp.Identity:DuplicateUserName": "Užívateľské meno '{0}' sa už používa.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Vaše geslo je bilo uspešno spremenjeno.",
"PersonalSettingsSavedMessage": "Vaše osebne nastavitve so bile uspešno shranjene.",
"Volo.Abp.Identity:DefaultError": "Zgodila se je neznana napaka.",
"Volo.Abp.Identity:ConcurrencyFailure": "Napaka pri optimistični sočasnosti, objekt je bil spremenjen.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistično preverjanje sočasnosti ni uspelo. Entitet, na katerem delate, je spremenil drug uporabnik. Zavrzite spremembe in poskusite znova.",
"Volo.Abp.Identity:DuplicateEmail": "E-poštni naslov '{0}' je že zaseden.",
"Volo.Abp.Identity:DuplicateRoleName": "Naziv vloge '{0}' je že zasedeno.",
"Volo.Abp.Identity:DuplicateUserName": "Uporabniško ime '{0}' je že zasedeno.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Şifreniz başarıyla değiştirildi.",
"PersonalSettingsSavedMessage": "Kişisel bilgileriniz başarıyla kaydedildi.",
"Volo.Abp.Identity:DefaultError": "Bilinmeyen bir hata oluştu.",
"Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık hatası. Nesne değiştirilmiş.",
"Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık denetimi başarısız oldu. Üzerinde çalıştığınız varlık başka bir kullanıcı tarafından değiştirildi. Lütfen değişikliklerinizi geri alın ve tekrar deneyin.",
"Volo.Abp.Identity:DuplicateEmail": "'{0}' email adresi zaten alınmış.",
"Volo.Abp.Identity:DuplicateRoleName": "'{0}' rol ismi zaten alınmış.",
"Volo.Abp.Identity:DuplicateUserName": "'{0}' kullanıcı adı zaten alınmış.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "Mật khẩu của bạn đã được thay đổi thành công.",
"PersonalSettingsSavedMessage": "Thiết lập của bạn đã được lưu lại thành công.",
"Volo.Abp.Identity:DefaultError": "Một thất bại chưa biết đã xảy ra.",
"Volo.Abp.Identity:ConcurrencyFailure": "Thất bại đồng thời lạc quan, đối tượng đã được sửa đổi.",
"Volo.Abp.Identity:ConcurrencyFailure": "Kiểm tra đồng thời lạc quan đã không thành công. Thực thể bạn đang làm việc đã bị người dùng khác sửa đổi. Vui lòng hủy các thay đổi của bạn và thử lại.",
"Volo.Abp.Identity:DuplicateEmail": "Email '{0}' đã được sử dụng.",
"Volo.Abp.Identity:DuplicateRoleName": "Tên vài trò '{0}' đã được sử dụng.",
"Volo.Abp.Identity:DuplicateUserName": "User name '{0}' đã được sử dụng.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "你已成功更改密码.",
"PersonalSettingsSavedMessage": "你的个人设置保存成功.",
"Volo.Abp.Identity:DefaultError": "发生了一个未知错误.",
"Volo.Abp.Identity:ConcurrencyFailure": "对象已被修改,乐观并发失败.",
"Volo.Abp.Identity:ConcurrencyFailure": "乐观并发检查失败. 你正在处理的对象已被其他用户修改. 请放弃你的更改, 然后重试.",
"Volo.Abp.Identity:DuplicateEmail": "邮箱 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateUserName": "用户名 '{0}' 已存在.",

@ -37,7 +37,7 @@
"PasswordChangedMessage": "你已成功更改密碼.",
"PersonalSettingsSavedMessage": "你的個人設置保存成功.",
"Volo.Abp.Identity:DefaultError": "發生了一個未知錯誤.",
"Volo.Abp.Identity:ConcurrencyFailure": "對象已被修改,因樂觀並行控制導致失敗.",
"Volo.Abp.Identity:ConcurrencyFailure": "樂觀並行控制檢查失敗. 你正在處理的對象已被其他用戶修改. 請放棄你的更改, 然後重試.",
"Volo.Abp.Identity:DuplicateEmail": "電子信箱 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateUserName": "使用者名稱 '{0}' 已存在.",

Loading…
Cancel
Save