using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
public static void Main()
using (var context = new EntityContext())
context.Database.EnsureCreated();
var assetUuId = Guid.NewGuid();
new EntityContext().BulkInsert(new[] { new HistoryEntity
InstanceAssociations = new List<InstanceAssociations> { new InstanceAssociations { InstanceId = assetUuId, Added = DateTime.UtcNow } }
}}, options => options.IncludeGraph = true);
using (var context = new EntityContext())
FiddleHelper.WriteTable("1 - History Entity Before", context.HistoryEntities.AsNoTracking());
FiddleHelper.WriteTable("2 - InstanceAssociations Before", context.InstanceAssociations.AsNoTracking());
context.BulkMerge(new[] {new HistoryEntity
InstanceAssociations = new List<InstanceAssociations> { new InstanceAssociations { InstanceId = assetUuId, Added = DateTime.UtcNow } }
options.IncludeGraph = true;
options.InsertIfNotExists = true;
options.IncludeGraphOperationBuilder = operation =>
if (operation is BulkOperation<InstanceAssociations>)
var options = (BulkOperation<InstanceAssociations>)operation;
options.IgnoreOnMergeUpdateExpression = c => new { c.InstanceId, c.Added };
FiddleHelper.WriteTable("3 - History Entity After", context.HistoryEntities.AsNoTracking());
FiddleHelper.WriteTable("4 - InstanceAssociations After", context.InstanceAssociations.AsNoTracking());
public class EntityContext : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer(new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()));
base.OnConfiguring(optionsBuilder);
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<HistoryEntity>(entity =>
entity.HasKey(e => e.HistoryId);
entity.ToTable("HistoryEntity", "Historian");
entity.HasIndex(e => new { e.Identifier, e.Name })
.HasName("IX_HistoryEntity_Identifier")
entity.Property(e => e.HistoryRowVersion)
entity.Property(e => e.Identifier)
entity.Property(e => e.Name)
entity.Property(e => e.Units)
modelBuilder.Entity<InstanceAssociations>(entity =>
entity.HasKey(e => e.InstanceAssociationId)
.HasName("PK__Instance__D6F0AA9D8AB3A7C0");
entity.ToTable("InstanceAssociations", "Historian");
entity.HasIndex(e => new { e.Added, e.HistoryId, e.InstanceId, e.Removed })
.HasName("IX_InstanceAssociations_InstanceId");
entity.HasIndex(e => new { e.Added, e.HistoryId, e.Removed, e.InstanceId })
.HasName("IX_InstanceAssociations_Removed")
.HasFilter("([Removed] IS NULL)");
entity.HasIndex(e => new { e.Added, e.Removed, e.InstanceId, e.HistoryId })
.HasName("IX_InstanceAssociations_InstanceId_HistoryId");
entity.HasIndex(e => new { e.InstanceId, e.Added, e.Removed, e.HistoryId })
.HasName("IX_InstanceAssociations_HistoryId");
entity.HasOne(d => d.History)
.WithMany(p => p.InstanceAssociations)
.HasForeignKey(d => d.HistoryId)
.HasConstraintName("FK_Historian_InstanceAssociations");
public DbSet<HistoryEntity> HistoryEntities { get; set; }
public DbSet<InstanceAssociations> InstanceAssociations { get; set; }
public partial class HistoryEntity
InstanceAssociations = new HashSet<InstanceAssociations>();
public long HistoryId { get; set; }
public byte[] HistoryRowVersion { get; set; }
public string Identifier { get; set; }
public string Name { get; set; }
public string Units { get; set; }
public virtual ICollection<InstanceAssociations> InstanceAssociations { get; set; }
public partial class InstanceAssociations
public long InstanceAssociationId { get; set; }
public long HistoryId { get; set; }
public Guid InstanceId { get; set; }
public DateTime Added { get; set; }
public DateTime? Removed { get; set; }
public virtual HistoryEntity History { get; set; }