using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
public static void Main()
using (var context = new EntityContext())
context.Database.EnsureCreated();
var stores = new List<Post>()
new Post() { Content = "Store_A", Location = new Location() { Address = "Address_A" } },
new Post() { Content = "Store_B", Location = new Location() { Address = "Address_B" } },
using (var context = new EntityContext())
var referenceEquality = new ReferenceEqualityComparer<object>();
context.BulkInsert(stores, options => {
options.IncludeGraph = true;
options.UnsafeMode = true;
options.DictionaryEqualityComparer = referenceEquality;
FiddleHelper.WriteTable("Locations", context.Locations.AsNoTracking());
FiddleHelper.WriteTable("Posts", context.Posts.Include(x => x.Location).AsNoTracking());
public class EntityContext : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer(new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()));
base.OnConfiguring(optionsBuilder);
public DbSet<Location> Locations { get; set; }
public DbSet<Post> Posts { get; set; }
public int LocationID { get; set; }
public string Address { get; set; }
public List<Post> Posts { get; set; }
public override bool Equals(object other)
LocationID == (other as Location).LocationID &&
Address == (other as Location).Address;
public override int GetHashCode()
return HashCode.Combine(LocationID, Address);
public int Id { get; set; }
public string Content { get; set; }
public Location Location { get; set; }
public sealed class ReferenceEqualityComparer<T> : IEqualityComparer<T> where T : class
private static readonly ReferenceEqualityComparer<T> _instance = new ReferenceEqualityComparer<T>();
public static ReferenceEqualityComparer<T> Instance => Instance;
public bool Equals(T left, T right) => Object.ReferenceEquals(left, right);
public int GetHashCode(T value)
return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(value);