Ef Core 3.1 Генерация первичного ключа по свойствам - PullRequest
0 голосов
/ 13 июля 2020

Как я могу сгенерировать первичный ключ по свойствам объекта? Мне нужно что-то вроде ha sh. Но стабильный хеш;

public Object1 {
   public Object1(string property1, DateTime property2)
   {
      Property1 = property1;
      Property2 = property2;
      StableHashID = GetStableHash();
   }
   
   [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
   public int StableHashID { get; private set; } 

   public string Property1 { get; private set; }

   public DateTime Property2 { get; private set; }

   public int GetStableHash()
   {
      return ...; // ???
   }

}

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Без отражения:

   public int GetStableHash()
   {
      var now = DateTime.Now;
      var nowInt = (int) now.Kind;
      var nowTicks = (ulong) now.Ticks;
      return (((ulong) nowInt) << 62) | nowTicks;
   }

Со свойствами: { ссылка }

EDIT:

Но я все еще думаю, что GUID достаточно хорош - автоматически генерируется, инкрементально, имеет преимущества с EFCore (например, метод обновления), et c.

Fluent API:

public override void Configure(EntityTypeBuilder<Entity> entityBuilder)
{
      entityBuilder.Property(entity => entity.Id).HasDefaultValueSql("NEWID()");   
}

Или с аннотацией: [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

1 голос
/ 14 июля 2020

Если вы хотите сгенерировать первичные ключи на основе значений других свойств, тогда вам нужно сгенерировать разные значения ha sh из этих двух значений свойств в методе GetStableHash.

  public class Object1
    {
        public Object1(string property1, DateTime property2)
        {
            Property1 = property1;
            Property2 = property2;
            StableHashID = GetStableHash();
        }

        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int StableHashID { get; private set; }

        public string Property1 { get; private set; }

        public DateTime Property2 { get; private set; }

        public int GetStableHash()
        {
            var result = default(byte[]);

            using (var stream = new MemoryStream())
            {
                using (var writer = new BinaryWriter(stream, Encoding.UTF8, true))
                {
                    writer.Write(Property2.Ticks);
                    writer.Write(Property1);
                    writer.Write(Guid.NewGuid().ToString());
                }

                stream.Position = 0;

                using (var hash = SHA256.Create())
                {
                    result = hash.ComputeHash(stream);
                }
            } 

            return BitConverter.ToInt32(result, 0); 
        }
1 голос
/ 13 июля 2020

Гида вам хватит. Если вы будете использовать столбец Id только в качестве индекса, Guid.NewGuid() сгенерирует для вас отличный ha sh.

Guid.NewGuid() makes an actual guid with a unique value, what you probably want.

Guid.NewGuid () vs. new Guid ()

Однако, если вы найдете значения объекта после расшифровки ha sh, вы можете проверить;

Шифрование и дешифрование строки в C#

0 голосов
/ 15 июля 2020

Нахожу другие решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...