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 или опубликуйте свой пример здесь.