| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- 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
- {
- /// <summary>
- /// 属性
- /// </summary>
- public PropertyInfo PropertyInfo { get; set; }
- /// <summary>
- /// 原始值
- /// </summary>
- public object OriginalValue { get; set; }
- /// <summary>
- /// 新值
- /// </summary>
- public object CurrentValue { get; set; }
- /// <summary>
- /// 所属实体
- /// </summary>
- public object Entity { get; set; }
- /// <summary>
- /// 实体类型
- /// </summary>
- public Type EntityType { get; set; }
- /// <summary>
- /// 变更类型
- /// </summary>
- public EntityState EntityState { get; set; }
- /// <summary>
- /// 是否是主键
- /// </summary>
- public bool IsPrimaryKey { get; set; }
- /// <summary>
- /// 是否是外键
- /// </summary>
- public bool IsForeignKey { get; set; }
- }
- public static class DbContextExt
- {
- /// <summary>
- /// 获取变化的实体信息
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> GetChanges<T>(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);
- });
- }
- /// <summary>
- /// 获取变化的实体信息
- /// </summary>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> 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);
- });
- }
- /// <summary>
- /// 获取添加的实体信息
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> GetAdded<T>(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
- });
- });
- }
- /// <summary>
- /// 获取添加的实体信息
- /// </summary>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> 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
- });
- });
- }
- /// <summary>
- /// 获取移除的实体信息
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> GetRemoved<T>(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
- });
- });
- }
- /// <summary>
- /// 获取移除的实体信息
- /// </summary>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> 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
- });
- });
- }
- /// <summary>
- /// 获取所有的变更信息
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> GetAllChanges<T>(this DbContext db)
- {
- return GetChanges<T>(db).Union(GetAdded<T>(db)).Union(GetRemoved<T>(db));
- }
- /// <summary>
- /// 获取所有的变更信息
- /// </summary>
- /// <param name="db"></param>
- /// <returns></returns>
- public static IEnumerable<ChangePropertyValue> GetAllChanges(this DbContext db)
- {
- return GetChanges(db).Union(GetAdded(db)).Union(GetRemoved(db));
- }
- }
- }
|