Выполните tNet Core 3.1 с удостоверением, проблема с полем поддержки: попытка изменить подпись ConcurrencyStamp - PullRequest
0 голосов
/ 31 января 2020

Попытка изменить базу 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 сервер будет выполнять генерацию, не код.)

Предложения к обеим частям моей проблемы?

...