Я пытался использовать объект значения в качестве уникального идентификатора в ядре платформы сущностей. Я дошел до того, что он правильно сохраняет данные в базе данных, но 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> Сопоставить пользовательский тип как первичный ключ