entity-framework-extensions

EFPlus BulkInsert - How to get DB-generated IDs


Using MSSQL with IDENTITY column for IDs, how can I get entity IDs synchronized with table IDs after calling BulkInsert?

context.BulkInsert(entities);

Neither of both achieves the requested result:

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

Assume we have one entity

var newSomething = new Something { Id = 0 };

and the corresponding TSQL table column definition

ID int IDENTITY(1,1)

Entity Framework automatically sets Id after calling SaveChanges()

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

See also How can I get Id of inserted entity in Entity framework?

How does EFPlus provide a way of getting the Id of inserted entities?


Solution

  • Disclaimer: I'm the owner of the project Entity Framework Extensions

    The Entity Framework Extensions library should by default already return the ids for inserted entities.

    For example, the following code should already work and return ids when using with 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; }
            }
        }
    }
    

    If you still have the issue, try to contact us directly with an example info@zzzprojects.com or post your example here.