EFCore BulkInsert с отношениями один к одному - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь использовать bulkinsert из EFCore.BulkExtensions в. NET Core 2.1 с отношениями один к одному. У меня есть 2 объекта базы данных

public partial class Entity1
{
    public int ID { get; set; }
    public virtual Entity2 Entity2Obj { get; set; }
}

public partial class Entity2 
{
    public int ID { get; set; }
    public int Entity1_ID{ get; set; }
    public virtual Entity1 Entity1Obj { get; set; }
}

Затем я вставляю список элементов Entity1

 _context.BulkInsert(Entity1ItemsList);

Это работает только и вставляет объекты Entity1 в мою базу данных. Связанные элементы Entity2 не вставляются. Есть ли способ добиться этого?

Свойства навигации автоматически создаются во время Scaffold-DbContext (база данных сначала)

entity.HasOne(d => d.Entity1 )
    .WithOne(p => p.Entity2)
    .HasForeignKey<Entity2>(d => d.Entity1_ID)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("FK_Entity1_Entity2");

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

После поиска вокруг, я думаю, что нашел решение. Прежде всего установите следующую конфигурацию

var bulkConfig = new BulkConfig()
{
    SetOutputIdentity = true,
    PreserveInsertOrder = true
};

Запустите начальный пакет массовых конфигураций, чтобы вставить Entities1List и получить уникальные идентификаторы из SQL Сервер

_context.BulkInsert(Entity1ItemsList, bulkConfig);

Теперь назначены уникальные первичные ключи поэтому, чтобы установить их значения для связанных объектов, используйте

foreach (var item in Entity1ItemsList)
{
    item.Entity2Obj.Entity1_ID = item.ID;
}

. Это установит правильные значения внешнего ключа. Затем я BulkInsert Entities2List

var Entities2List = Entity1ItemsList.Select(u => u.Entity2Obj).ToList();
 _context.BulkInsert(Entities2List);

Я надеялся на что-то более простое, используя только один BulkInsert, который автоматически добавит все свойства навигации вместо 2. Но это работает, и это быстро.

0 голосов
/ 24 апреля 2020

Это, вероятно, то, что вы ищете, так как вы также хотите вставить дочерние свойства.

context.BulkInsert(Entity1ItemsList, options => options.IncludeGraph = true);

Подробнее вы можете прочитать здесь :

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