Если вы используете SQL Server, то лучшие практики для ПК UniqueIndentifier / GUID и Entity Framework будут:
- Настройте базу данных для назначения значения по умолчанию для столбца PK с помощью (newsequentialid ()),Это автоматически сгенерирует новые идентификаторы, которые лучше подходят для кластерной индексации.Не используйте (newid ()) и не полагайтесь на
Guid.NewGuid()
в коде для создания Guids.Они играют в ад с индексами. - Установите первичные ключи EF с помощью
DatabaseGeneratedOption.Identity
, чтобы сообщить EF, что ключи будут обрабатываться базой данных. - Используйте свойства навигации для управления назначениями FK, а не свойства FK.Причина этого заключается в том, что при создании иерархий родитель-потомок, где база данных обрабатывает PK, вы не узнаете родительский идентификатор до тех пор, пока после SaveChanges и у дочерних элементов не будет нулевых FK для их родителя.
Например, при наличии Order с OrderLines таблица OrderLine будет иметь FK с именем OrderId обратно к Order.Вы не можете:
var order = new Order
{
OrderNumber = orderVM.OrderNumber,
// populate order details from view model...
}
context.Orders.Add(order);
foreach(orderLineVM in orderVM)
{
var orderLine = new OrderLine
{
OrderId = order.OrderId // This will be 0 until after SaveChanges.
}
context.OrderLines.Add(orderLine);
}
Вместо этого вы хотите, чтобы Order содержал сопоставленную коллекцию OrderLines, чтобы операция вставки выглядела следующим образом:
var order = new Order
{
OrderNumber = orderVM.OrderNumber,
// populate order details...
OrderLines = orderVM.OrderLines.Select(ol => new OrderLine
{
// Populate order lines from view model.
}).ToList(),
}
context.Orders.Add(order);
EF будет обрабатыватьFK ассоциации как объекты сохраняются.
В худшем случае, если вам нужно назначить PK на стороне клиента, прочитайте, как newsequentialid () генерирует Guids в SQL Server, и реализуйте вспомогательный метод для создания совпадающих Guids.Обратите внимание, что если вы используете Oracle или другие базы данных, которые поддерживают UUID и т. Д., Вам следует изучить, как они представлены и проиндексированы для использования формата (Big vs. Little Endian), который дополняет индексацию.В этом случае вы также используете DatabaseGeneratedOption.None
, чтобы гарантировать, что EF / dev знают, что PK назначен кодом.