mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 修复 Aop.AuditValue 与 FreeSql.Repository 主键状态管理的冲突;
This commit is contained in:
@ -2164,7 +2164,7 @@
|
||||
耗时(单位:毫秒)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.Aop.AuditValueEventArgs.AutoValueType">
|
||||
<member name="P:FreeSql.Aop.AuditValueEventArgs.AuditValueType">
|
||||
<summary>
|
||||
类型
|
||||
</summary>
|
||||
|
@ -273,18 +273,18 @@ namespace FreeSql.Aop
|
||||
|
||||
public class AuditValueEventArgs : EventArgs
|
||||
{
|
||||
public AuditValueEventArgs(AutoValueType autoValueType, ColumnInfo column, PropertyInfo property, object value)
|
||||
public AuditValueEventArgs(AuditValueType autoValueType, ColumnInfo column, PropertyInfo property, object value)
|
||||
{
|
||||
this.AutoValueType = autoValueType;
|
||||
this.AuditValueType = autoValueType;
|
||||
this.Column = column;
|
||||
this.Property = property;
|
||||
this.Value = value;
|
||||
this._value = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 类型
|
||||
/// </summary>
|
||||
public AutoValueType AutoValueType { get; }
|
||||
public AuditValueType AuditValueType { get; }
|
||||
/// <summary>
|
||||
/// 属性列的元数据
|
||||
/// </summary>
|
||||
@ -308,5 +308,5 @@ namespace FreeSql.Aop
|
||||
private object _value;
|
||||
public bool IsChanged { get; private set; }
|
||||
}
|
||||
public enum AutoValueType { Update, Insert }
|
||||
public enum AuditValueType { Update, Insert }
|
||||
}
|
@ -71,19 +71,56 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
public IInsert<T1> AppendData(T1 source)
|
||||
{
|
||||
if (source != null) _source.Add(source);
|
||||
if (source != null)
|
||||
{
|
||||
AuditDataValue(this, source, _orm, _table);
|
||||
_source.Add(source);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public IInsert<T1> AppendData(T1[] source)
|
||||
{
|
||||
if (source != null) _source.AddRange(source);
|
||||
if (source != null)
|
||||
{
|
||||
AuditDataValue(this, source, _orm, _table);
|
||||
_source.AddRange(source);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public IInsert<T1> AppendData(IEnumerable<T1> source)
|
||||
{
|
||||
if (source != null) _source.AddRange(source.Where(a => a != null));
|
||||
if (source != null)
|
||||
{
|
||||
source = source.Where(a => a != null).ToList();
|
||||
AuditDataValue(this, source, _orm, _table);
|
||||
_source.AddRange(source);
|
||||
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public static void AuditDataValue(object sender, IEnumerable<T1> data, IFreeSql orm, TableInfo table)
|
||||
{
|
||||
if (data?.Any() != true) return;
|
||||
foreach (var d in data)
|
||||
AuditDataValue(sender, d, orm, table);
|
||||
}
|
||||
public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table)
|
||||
{
|
||||
if (data == null) return;
|
||||
foreach (var col in table.Columns.Values)
|
||||
{
|
||||
object val = col.GetMapValue(data);
|
||||
if (col.Attribute.IsPrimary && col.Attribute.MapType.NullableTypeOrThis() == typeof(Guid) && (val == null || (Guid)val == Guid.Empty))
|
||||
col.SetMapValue(data, val = FreeUtil.NewMongodbId());
|
||||
if (orm.Aop.AuditValue != null)
|
||||
{
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Insert, col, table.Properties[col.CsName], val);
|
||||
orm.Aop.AuditValue(sender, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(data, val = auditArgs.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region 参数化数据限制,或values数量限制
|
||||
protected List<T1>[] SplitSource(int valuesLimit, int parameterLimit)
|
||||
@ -557,15 +594,6 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
if (colidx2 > 0) sb.Append(", ");
|
||||
object val = col.GetMapValue(d);
|
||||
if (col.Attribute.IsPrimary && col.Attribute.MapType.NullableTypeOrThis() == typeof(Guid) && (val == null || (Guid)val == Guid.Empty))
|
||||
col.SetMapValue(d, val = FreeUtil.NewMongodbId());
|
||||
if (_orm.Aop.AuditValue != null)
|
||||
{
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AutoValueType.Insert, col, _table.Properties[col.CsName], val);
|
||||
_orm.Aop.AuditValue(this, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(d, val = auditArgs.Value);
|
||||
}
|
||||
if (_noneParameter)
|
||||
sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val));
|
||||
else
|
||||
|
@ -401,10 +401,42 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this;
|
||||
}
|
||||
|
||||
public static void AuditDataValue(object sender, IEnumerable<T1> data, IFreeSql orm, TableInfo table)
|
||||
{
|
||||
if (data?.Any() != true) return;
|
||||
if (orm.Aop.AuditValue == null) return;
|
||||
foreach (var d in data)
|
||||
{
|
||||
if (d == null) continue;
|
||||
foreach (var col in table.Columns.Values)
|
||||
{
|
||||
object val = col.GetMapValue(d);
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Update, col, table.Properties[col.CsName], val);
|
||||
orm.Aop.AuditValue(sender, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(d, val = auditArgs.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table)
|
||||
{
|
||||
if (orm.Aop.AuditValue == null) return;
|
||||
if (data == null) return;
|
||||
foreach (var col in table.Columns.Values)
|
||||
{
|
||||
object val = col.GetMapValue(data);
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Update, col, table.Properties[col.CsName], val);
|
||||
orm.Aop.AuditValue(sender, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(data, val = auditArgs.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public IUpdate<T1> SetSource(T1 source) => this.SetSource(new[] { source });
|
||||
public IUpdate<T1> SetSource(IEnumerable<T1> source)
|
||||
{
|
||||
if (source == null || source.Any() == false) return this;
|
||||
AuditDataValue(this, source, _orm, _table);
|
||||
_source.AddRange(source.Where(a => a != null));
|
||||
return this;
|
||||
}
|
||||
@ -606,13 +638,6 @@ namespace FreeSql.Internal.CommonProvider
|
||||
if (colidx > 0) sb.Append(", ");
|
||||
sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ");
|
||||
var val = col.GetMapValue(_source.First());
|
||||
if (_orm.Aop.AuditValue != null)
|
||||
{
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AutoValueType.Update, col, _table.Properties[col.CsName], val);
|
||||
_orm.Aop.AuditValue(this, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(_source.First(), val = auditArgs.Value);
|
||||
}
|
||||
if (_noneParameter)
|
||||
sb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val));
|
||||
else
|
||||
@ -629,7 +654,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
else if (_source.Count > 1)
|
||||
{ //批量保存 Source
|
||||
if (_table.Primarys.Any() == false) return null;
|
||||
|
||||
|
||||
var caseWhen = new StringBuilder();
|
||||
caseWhen.Append("CASE ");
|
||||
ToSqlCase(caseWhen, _table.Primarys);
|
||||
@ -652,13 +677,6 @@ namespace FreeSql.Internal.CommonProvider
|
||||
ToSqlWhen(cwsb, _table.Primarys, d);
|
||||
cwsb.Append(" THEN ");
|
||||
var val = col.GetMapValue(d);
|
||||
if (_orm.Aop.AuditValue != null)
|
||||
{
|
||||
var auditArgs = new Aop.AuditValueEventArgs(Aop.AutoValueType.Update, col, _table.Properties[col.CsName], val);
|
||||
_orm.Aop.AuditValue(this, auditArgs);
|
||||
if (auditArgs.IsChanged)
|
||||
col.SetMapValue(_source.First(), val = auditArgs.Value);
|
||||
}
|
||||
if (_noneParameter)
|
||||
cwsb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val));
|
||||
else
|
||||
|
@ -57,22 +57,22 @@ namespace FreeSql.Internal.Model
|
||||
var objExp = Expression.Parameter(typeof(object), "obj");
|
||||
var valExp = Expression.Parameter(typeof(object), "val");
|
||||
|
||||
if (Attribute.MapType == CsType)
|
||||
return Expression.Lambda<Action<object, object>>(
|
||||
Expression.Assign(Expression.MakeMemberAccess(
|
||||
Expression.TypeAs(objExp, col.Table.Type),
|
||||
Table.Properties[col.CsName]
|
||||
), Expression.Convert(
|
||||
valExp,
|
||||
Attribute.MapType)), objExp, valExp).Compile();
|
||||
//if (Attribute.MapType == CsType)
|
||||
// return Expression.Lambda<Action<object, object>>(
|
||||
// Expression.Assign(Expression.MakeMemberAccess(
|
||||
// Expression.TypeAs(objExp, col.Table.Type),
|
||||
// Table.Properties[col.CsName]
|
||||
// ), Expression.Convert(
|
||||
// valExp,
|
||||
// Attribute.MapType)), objExp, valExp).Compile();
|
||||
|
||||
return Expression.Lambda<Action<object, object>>(
|
||||
Expression.Assign(Expression.MakeMemberAccess(
|
||||
Expression.TypeAs(objExp, col.Table.Type),
|
||||
Table.Properties[col.CsName]
|
||||
), Expression.Convert(
|
||||
Utils.GetDataReaderValueBlockExpression(Attribute.MapType, valExp),
|
||||
Attribute.MapType)), objExp, valExp).Compile();
|
||||
Utils.GetDataReaderValueBlockExpression(CsType, valExp),
|
||||
CsType)), objExp, valExp).Compile();
|
||||
});
|
||||
func(obj, val);
|
||||
}
|
||||
|
Reference in New Issue
Block a user