Попытка изменить базу c Identity (НЕ IdentityServer4), чтобы он делал то, что я хочу. Я уже успешно получил возможность переключаться на GUID для первичных ключей (проверено и подтверждено), но штампы параллелизма просто меня теряют.
В Identity 3.1 и таблица User, и таблица Role есть поле с именем ConcurrencyStamp. Для того, чтобы он хорошо работал с Identity, я хотел бы сохранить его как именованное поле, как в коде, так и в базе данных.
Однако поле по умолчанию является сгенерированным кодом Guid
, преобразуется и сохраняется в виде строки в модели и сохраняется в БД в поле nvarchar
. Я немного пурист, это дает мне heeb ie -jeebies.
То, что я хотел бы сделать, это db-Генерировать значения timestamp
, которые хранятся в массиве byte[]
в модели, и хранится в БД в поле rowversion
. Это привело бы его в соответствие с тем, какой должна быть идеализированная метка параллелизма .
И в случае неудачи я хотел бы по крайней мере работать с GUID в качестве GUID, Например, в качестве поля модели укажите Guid
, а в поле БД - uniqueidentifier
.
Моя проблема двоякая:
Во-первых, я подозреваю, что мне, вероятно, придется измените некоторую глубинную часть Identity, так как она ожидает сравнения строки на обоих концах (существующие данные для обновления БД и то, что существует в БД). Имея не строку, это, скорее всего, придется переопределить и изменить, и я вообще не нашел никакой информации о том, как этого добиться.
Во-вторых, насколько я понимаю, попытка изменить подпись ConcurrencyStamp
любым способом, необходимо изменить его, чтобы свойство могло быть представлено как другой тип . Мои попытки изменить поле поддержки до сих пор не увенчались успехом. Я пришел прямо из среды Do tNet MVC 5, поэтому ядро Do tNet все еще очень, очень новое для меня.
Таким образом, в действительности у меня есть измененный пользователь со стандартным ConcurrencyStamp :
public class User : IdentityUser<Guid> {
[PersonalData]
public override Guid Id { get; set; }
public override string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
И я хочу либо использовать правильный ConcurrencyStamp с rowversion
public override byte[] ConcurrencyStamp { get; set; }
builder.Property( x => x.ConcurrencyStamp ).HasColumnName( "ConcurrencyStamp" ).HasColumnType( "rowversion" ).ValueGeneratedOnAddOrUpdate().IsConcurrencyToken().IsRequired();
Или, если это слишком сложно, более подлинный GUID:
public override Guid ConcurrencyStamp { get; set; }
builder.Property( x => x.ConcurrencyStamp ).HasColumnName( "ConcurrencyStamp" ).HasColumnType( "uniqueidentifier" ).ValueGeneratedOnAddOrUpdate().IsConcurrencyToken().IsRequired();
(И да, в обоих случаях SQL сервер будет выполнять генерацию, не код.)
Предложения к обеим частям моей проблемы?