using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Z.EntityFramework.Plus;
public static void Main()
using (var context = new EntityContext())
context.Database.EnsureCreated();
var guidID1 = new Guid("00000000-0000-0000-0000-000000000013");
var guidID2 = new Guid("00000000-0000-0000-0000-000000000014");
using (var context = new EntityContext())
var entity1 = new GeneratedValueWithDataAnnotation() {
TestName = "INSERT with values (SaveChanges)",
Concurrency = "INSERT (Save)",
DefaultValue = "INSERT (Save)",
RowVersion = "INSERT (Ignore)",
ValueGeneratedNever = "INSERT (Save)",
ValueGeneratedOnAdd = "INSERT (Save)",
ValueGeneratedOnAddOrUpdate = "INSERT (Ignore)",
ValueGeneratedOnUpdate = "INSERT (Save)",
ValueGeneratedOnUpdateSometimes = "INSERT (Save)"
var entity2 = new GeneratedValueWithDataAnnotation() {
TestName = "INSERT with values (ExplicitValueResolutionMode.AlwaysKeepValueOnInsertOrUpdate)",
Concurrency = "INSERT (Save)",
DefaultValue = "INSERT (Save)",
RowVersion = "INSERT (Save)",
ValueGeneratedNever = "INSERT (Save)",
ValueGeneratedOnAdd = "INSERT (Save)",
ValueGeneratedOnAddOrUpdate = "INSERT (Save)",
ValueGeneratedOnUpdate = "INSERT (Save)",
ValueGeneratedOnUpdateSometimes = "INSERT (Save)"
context.GeneratedValueWithDataAnnotations.Add(entity1);
context.Database.OpenConnection();
context.GeneratedValueWithDataAnnotations.SqlServerSetIdentityInsertOn();
context.GeneratedValueWithDataAnnotations.SqlServerSetIdentityInsertOff();
context.BulkMerge(new List<GeneratedValueWithDataAnnotation>() { entity2 }, options => { options.ExplicitValueResolutionMode = Z.EntityFramework.Extensions.ExplicitValueResolutionMode.AlwaysKeepValueOnInsertOrUpdate; });
FiddleHelper.WriteTable("1 - INSERT with values", context.GeneratedValueWithDataAnnotations.AsNoTracking().ToList());
using (var context = new EntityContext())
var list = context.GeneratedValueWithDataAnnotations.ToList();
var entity1 = list.Single(x => x.ID == guidID1);
var entity2 = list.Single(x => x.ID == guidID2);
entity1.TestName = "UPDATE with values (SaveChanges)";
entity1.Concurrency = "UPDATE (Save)";
entity1.DefaultValue = "UPDATE (Save)";
entity1.RowVersion = "UPDATE (Ignore)";
entity1.ValueGeneratedNever = "UPDATE (Save)";
entity1.ValueGeneratedOnAdd = "UPDATE (Save)";
entity1.ValueGeneratedOnAddOrUpdate = "UPDATE (Ignore)";
entity1.ValueGeneratedOnUpdate = "UPDATE (Ignore)";
entity1.ValueGeneratedOnUpdateSometimes = "UPDATE (Save)";
entity2.TestName = "UPDATE with values (ExplicitValueResolutionMode.AlwaysKeepValueOnInsertOrUpdate)";
entity2.Concurrency = "UPDATE (Save)";
entity2.DefaultValue = "UPDATE (Save)";
entity2.RowVersion = "UPDATE (Save)";
entity2.ValueGeneratedNever = "UPDATE (Save)";
entity2.ValueGeneratedOnAdd = "UPDATE (Save)";
entity2.ValueGeneratedOnAddOrUpdate = "UPDATE (Save)";
entity2.ValueGeneratedOnUpdate = "UPDATE (Save)";
entity2.ValueGeneratedOnUpdateSometimes = "UPDATE (Save)";
context.BulkMerge(new List<GeneratedValueWithDataAnnotation>() { entity2 }, options => { options.ExplicitValueResolutionMode = Z.EntityFramework.Extensions.ExplicitValueResolutionMode.AlwaysKeepValueOnInsertOrUpdate; });
FiddleHelper.WriteTable("2 - UPDATE with values", context.GeneratedValueWithDataAnnotations.AsNoTracking().ToList());
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<GeneratedValueWithDataAnnotation>().HasKey(x => x.ID);
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.Identity).UseIdentityColumn();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.Concurrency).IsConcurrencyToken();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.DefaultValue).HasDefaultValue("Entity Framework Extensions");
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.RowVersion).IsRowVersion();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.ValueGeneratedNever).ValueGeneratedNever();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.ValueGeneratedOnAdd).ValueGeneratedOnAdd();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.ValueGeneratedOnAddOrUpdate).ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.ValueGeneratedOnUpdate).ValueGeneratedOnUpdate();
modelBuilder.Entity<GeneratedValueWithDataAnnotation>().Property(x => x.ValueGeneratedOnUpdateSometimes).ValueGeneratedOnUpdateSometimes();
base.OnModelCreating(modelBuilder);
public DbSet<GeneratedValueWithDataAnnotation> GeneratedValueWithDataAnnotations { get; set; }
public class GeneratedValueWithDataAnnotation
public Guid ID { get; set; }
public string TestName { get; set; }
public int Identity { get; set; }
public string Concurrency { get; set; }
public string DefaultValue { get; set; }
public string RowVersion { get; set; }
public string ValueGeneratedNever { get; set; }
public string ValueGeneratedOnAdd { get; set; }
public string ValueGeneratedOnAddOrUpdate { get; set; }
public string ValueGeneratedOnUpdate { get; set; }
public string ValueGeneratedOnUpdateSometimes { get; set; }