using Microsoft.EntityFrameworkCore; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Masuit.Tools.Core { public class ChangePropertyValue { /// /// 属性 /// public PropertyInfo PropertyInfo { get; set; } /// /// 原始值 /// public object OriginalValue { get; set; } /// /// 新值 /// public object CurrentValue { get; set; } /// /// 所属实体 /// public object Entity { get; set; } /// /// 实体类型 /// public Type EntityType { get; set; } /// /// 变更类型 /// public EntityState EntityState { get; set; } /// /// 是否是主键 /// public bool IsPrimaryKey { get; set; } /// /// 是否是外键 /// public bool IsForeignKey { get; set; } } public static class DbContextExt { /// /// 获取变化的实体信息 /// /// /// /// public static IEnumerable GetChanges(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified && e.Entity is T).SelectMany(e => { var originalObject = e.OriginalValues.ToObject(); var currentObject = e.CurrentValues.ToObject(); return e.OriginalValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(originalObject))).Zip(e.CurrentValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(currentObject))), (t1, t2) => new ChangePropertyValue() { PropertyInfo = t1.Property.PropertyInfo, OriginalValue = t1.Value, CurrentValue = t2.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t1.Property.IsPrimaryKey(), IsForeignKey = t1.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }).Where(t => Comparer.Default.Compare(t.OriginalValue, t.CurrentValue) != 0); }); } /// /// 获取变化的实体信息 /// /// /// public static IEnumerable GetChanges(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified).SelectMany(e => { var originalObject = e.OriginalValues.ToObject(); var currentObject = e.CurrentValues.ToObject(); return e.OriginalValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(originalObject))).Zip(e.CurrentValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(currentObject))), (t1, t2) => new ChangePropertyValue() { PropertyInfo = t1.Property.PropertyInfo, OriginalValue = t1.Value, CurrentValue = t2.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t1.Property.IsPrimaryKey(), IsForeignKey = t1.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }).Where(t => Comparer.Default.Compare(t.OriginalValue, t.CurrentValue) != 0); }); } /// /// 获取添加的实体信息 /// /// /// /// public static IEnumerable GetAdded(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added && e.Entity is T).SelectMany(e => { var currentObject = e.CurrentValues.ToObject(); return e.CurrentValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(currentObject))).Select(t => new ChangePropertyValue { PropertyInfo = t.Property.PropertyInfo, CurrentValue = t.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t.Property.IsPrimaryKey(), IsForeignKey = t.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }); }); } /// /// 获取添加的实体信息 /// /// /// public static IEnumerable GetAdded(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added).SelectMany(e => { var currentObject = e.CurrentValues.ToObject(); return e.CurrentValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(currentObject))).Select(t => new ChangePropertyValue { PropertyInfo = t.Property.PropertyInfo, CurrentValue = t.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t.Property.IsPrimaryKey(), IsForeignKey = t.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }); }); } /// /// 获取移除的实体信息 /// /// /// /// public static IEnumerable GetRemoved(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted && e.Entity is T).SelectMany(e => { var originalObject = e.OriginalValues.ToObject(); return e.OriginalValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(originalObject))).Select(t => new ChangePropertyValue { PropertyInfo = t.Property.PropertyInfo, OriginalValue = t.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t.Property.IsPrimaryKey(), IsForeignKey = t.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }); }); } /// /// 获取移除的实体信息 /// /// /// public static IEnumerable GetRemoved(this DbContext db) { return db.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted).SelectMany(e => { var originalObject = e.OriginalValues.ToObject(); return e.OriginalValues.Properties.Select(p => (Property: p, Value: p.PropertyInfo.GetValue(originalObject))).Select(t => new ChangePropertyValue { PropertyInfo = t.Property.PropertyInfo, OriginalValue = t.Value, EntityState = e.State, Entity = e.Entity, IsPrimaryKey = t.Property.IsPrimaryKey(), IsForeignKey = t.Property.IsForeignKey(), EntityType = e.OriginalValues.EntityType.ClrType }); }); } /// /// 获取所有的变更信息 /// /// /// /// public static IEnumerable GetAllChanges(this DbContext db) { return GetChanges(db).Union(GetAdded(db)).Union(GetRemoved(db)); } /// /// 获取所有的变更信息 /// /// /// public static IEnumerable GetAllChanges(this DbContext db) { return GetChanges(db).Union(GetAdded(db)).Union(GetRemoved(db)); } } }