EF Базовый объект значения непримитивного типа как первичный ключ? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытался использовать объект значения в качестве уникального идентификатора в ядре платформы сущностей. Я дошел до того, что он правильно сохраняет данные в базе данных, но EF неправильно запрашивает базу данных, чтобы найти мою сущность. Похоже, EF загружает всю таблицу, а затем выполняет отображение в памяти. Когда я смотрю на запрос, он не включает предикат для идентификатора.

Я имею дело с существующей базой данных, в которой используются 10-символьные строковые идентификаторы с дополненными нулями, поэтому я вижу, будет ли работать с ними как с объектами-значениями. Следующее, что я попробую, это просто использовать Guid и иметь 'SalesOrderNumber' в качестве отдельного поля. Однако это как раз для этого случая, и я действительно пытаюсь понять, возможно ли использовать объект значения в качестве первичного ключа в структуре сущностей.

Организация:

public class SalesOrder: Entity<SalesOrderNumber>
    {
        private SalesOrder() { }

        public SalesOrder(SalesOrderNumber id, DateTime dueDate)
        {
            Id = id;
            DueDate = dueDate;
            Open = true;
        }

        public override SalesOrderNumber Id { get; protected set; }
        public DateTime DueDate { get; private set; }
        public bool Open { get; private set; }
    }

Объект значения:

  public class SalesOrderNumber: ValueObject
    {
        private readonly string _salesOrderNumber;

        public SalesOrderNumber(string salesOrderNumber)
        {
            if (string.IsNullOrWhiteSpace(salesOrderNumber) || salesOrderNumber.Length > 10)
                throw new InvalidOperationException($"Sales Order Number  {salesOrderNumber} is invalid");

            _salesOrderNumber= salesOrderNumber;
        }

        protected override IEnumerable<object> GetAtomicValues()
        {
            yield return _salesOrderNumber;
        }

        public override string ToString() => _salesOrderNumber;
    }

Конфигурация БД:

public void Configure(EntityTypeBuilder<SalesOrder> builder)
        {
            builder.HasKey(e => e.Id);
            builder.Property(e => e.Id).HasConversion(number => number.ToString(), s => new SalesOrderNumber(s));

        }

Я просмотрел некоторые другие сообщения SO, но ни один из них не решил проблему, с которой столкнулся: EF Core / DbContext> Сопоставить пользовательский тип как первичный ключ

1 Ответ

0 голосов
/ 21 декабря 2018

Кажется, что проблема с производительностью, которую вы изложили, является открытой проблемой, о которой сообщалось на github: EF Базовый объект значения непримитивного типа в качестве первичного ключа?

Кто-то также сообщил о быстром исправлении: https://github.com/aspnet/EntityFrameworkCore/issues/13669#issuecomment-439589393 Если я правильно понял быстрое исправление, добавление оператора неявного преобразования из объекта значения к типу базового примитива и оператора неявного преобразования для обратного направления может решить вашу проблему. Пожалуйста, оставьте комментарий, если это работает для вас.

...