EFPlus BulkInsert - Как получить сгенерированные БД идентификаторы

Используя MSSQL со столбцом IDENTITY для идентификаторов, как я могу синхронизировать идентификаторы сущностей с идентификаторами таблиц после вызова BulkInsert?

context.BulkInsert(entities);

Ни то, ни другое не достигает запрошенного результата:

context.BulkSynchronize(entities);
context.BulkMerge(entities);

Предположим, у нас есть одна сущность

var newSomething = new Something { Id = 0 };

и соответствующее определение столбца таблицы TSQL

ID int IDENTITY(1,1)

Entity Framework автоматически устанавливает Id после вызова SaveChanges()

context.SomethingSet.Add(newSomething);
context.SaveChanges();
Assert.IsTrue(newSomething.Id != 0)

См. Также Как я могу получить идентификатор вставленной сущности в платформе Entity?

Как EFPlus предоставляет способ получения идентификатора вставленных объектов?

1 ответ

Решение

Отказ от ответственности: я владелец проекта http://entityframework-extensions.net/

Entity Framework Extensions библиотека должна по умолчанию уже возвращать идентификаторы для вставленных объектов.

Например, следующий код должен уже работать и возвращать идентификаторы при использовании с BulkInsert.

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Windows.Forms;

namespace Z.EntityFramework.Extensions.Lab
{
    public partial class Form_Request_Ids : Form
    {
        public Form_Request_DateNull()
        {
            InitializeComponent();

            // CLEAR
            using (var ctx = new CurrentContext())
            {
                ctx.EntitySimples.RemoveRange(ctx.EntitySimples);
                ctx.SaveChanges();
            }

            // TEST
            using (var ctx = new CurrentContext())
            {
                var list = new List<EntitySimple>();
                list.Add(new EntitySimple() { Id = 0, IntColumn = 1, CreatedDate = DateTime.Now });

                ctx.BulkInsert(list);
            }
        }

        public class CurrentContext : DbContext
        {
            public CurrentContext()
                : base("CodeFirstEntities")
            {
            }

            public DbSet<EntitySimple> EntitySimples { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Types().Configure(x => x.ToTable(GetType().DeclaringType != null ? GetType().DeclaringType.FullName.Replace(".", "_") + "_" + x.ClrType.Name : ""));

                base.OnModelCreating(modelBuilder);
            }
        }

        public class EntitySimple
        {
            public int Id { get; set; }

            public int IntColumn { get; set; }

            public DateTime CreatedDate { get; set; }
        }
    }
}

Если у вас все еще есть проблема, попробуйте связаться с нами напрямую с примером info@zzzprojects.com или опубликуйте свой пример здесь.

Другие вопросы по тегам