вставка guid в качестве первичного ключа - лучшая практика - PullRequest
0 голосов
/ 17 сентября 2018

Использование GUId в качестве первичного ключа.Это правильный способ реализовать это во время вставки?

    var item = new tbl_A(){
    Id = Guid.NewGuid().ToString("D")    
    };
  _context.tbl_A.Add(item);
  _context.SaveChanges();

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если вы используете SQL Server, то лучшие практики для ПК UniqueIndentifier / GUID и Entity Framework будут:

  1. Настройте базу данных для назначения значения по умолчанию для столбца PK с помощью (newsequentialid ()),Это автоматически сгенерирует новые идентификаторы, которые лучше подходят для кластерной индексации.Не используйте (newid ()) и не полагайтесь на Guid.NewGuid() в коде для создания Guids.Они играют в ад с индексами.
  2. Установите первичные ключи EF с помощью DatabaseGeneratedOption.Identity, чтобы сообщить EF, что ключи будут обрабатываться базой данных.
  3. Используйте свойства навигации для управления назначениями 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 назначен кодом.

0 голосов
/ 17 сентября 2018

Вам необходимо использовать некоторые атрибуты внутри вашей сущности.

public class Item : Entity{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Id{get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...