|
@@ -1,4 +1,5 @@
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
+using System;
|
|
|
using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
@@ -22,6 +23,32 @@ namespace Masuit.Tools.Core
|
|
|
/// 新值
|
|
|
/// </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
|
|
@@ -38,11 +65,41 @@ namespace Masuit.Tools.Core
|
|
|
{
|
|
|
var originalObject = e.OriginalValues.ToObject();
|
|
|
var currentObject = e.CurrentValues.ToObject();
|
|
|
- return e.OriginalValues.Properties.Select(p => (p.PropertyInfo, Value: p.PropertyInfo.GetValue(originalObject))).Zip(e.CurrentValues.Properties.Select(p => (p.PropertyInfo, Value: p.PropertyInfo.GetValue(currentObject))), (t1, t2) => new ChangePropertyValue()
|
|
|
+ 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.PropertyInfo,
|
|
|
+ PropertyInfo = t1.Property.PropertyInfo,
|
|
|
OriginalValue = t1.Value,
|
|
|
- CurrentValue = t2.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);
|
|
|
});
|
|
|
}
|
|
@@ -58,10 +115,38 @@ namespace Masuit.Tools.Core
|
|
|
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 => (p.PropertyInfo, Value: p.PropertyInfo.GetValue(currentObject))).Select(t => new ChangePropertyValue
|
|
|
+ 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.PropertyInfo,
|
|
|
- CurrentValue = t.Value
|
|
|
+ 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
|
|
|
});
|
|
|
});
|
|
|
}
|
|
@@ -77,12 +162,61 @@ namespace Masuit.Tools.Core
|
|
|
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 => (p.PropertyInfo, Value: p.PropertyInfo.GetValue(originalObject))).Select(t => new ChangePropertyValue
|
|
|
+ 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.PropertyInfo,
|
|
|
- OriginalValue = t.Value
|
|
|
+ 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));
|
|
|
+ }
|
|
|
}
|
|
|
}
|