From 33e992d96b13fa7b40409ef38cb42a1ac1bcbc8c Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sun, 5 May 2019 18:17:04 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20OnInserted=E3=80=81OnU?= =?UTF-8?q?pdated=E3=80=81OnDeleted=E3=80=81OnSelected=20=E7=AD=89=20AOP?= =?UTF-8?q?=20=E6=96=B9=E6=B3=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 75 ++++++++++++++ FreeSql/Interface/IAop.cs | 98 +++++++++++++++++++ .../Internal/CommonProvider/AopProvider.cs | 4 + .../Internal/CommonProvider/DeleteProvider.cs | 10 +- .../Internal/CommonProvider/InsertProvider.cs | 14 ++- .../SelectProvider/Select0Provider.cs | 76 +++++++++----- .../Internal/CommonProvider/UpdateProvider.cs | 8 +- FreeSql/MySql/Curd/MySqlDelete.cs | 10 +- FreeSql/MySql/Curd/MySqlInsert.cs | 20 +++- FreeSql/MySql/Curd/MySqlUpdate.cs | 10 +- FreeSql/Oracle/Curd/OracleInsert.cs | 18 +++- FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs | 10 +- FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs | 22 ++++- FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs | 10 +- FreeSql/SqlServer/Curd/SqlServerDelete.cs | 10 +- FreeSql/SqlServer/Curd/SqlServerInsert.cs | 20 +++- FreeSql/SqlServer/Curd/SqlServerUpdate.cs | 10 +- FreeSql/Sqlite/Curd/SqliteInsert.cs | 10 +- 19 files changed, 376 insertions(+), 61 deletions(-) diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 1b92dd05..55698c46 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.7 + 0.5.8 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index f45283ac..0a68971a 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1882,6 +1882,26 @@ 自定义实体的属性配置,方便和多个 ORM 共同使用 + + + IUpdate 执行成功后触发 + + + + + IInsert 执行成功后触发 + + + + + IDeleted 执行成功后触发 + + + + + ISelect 执行成功后触发 + + 可重新装饰的引用数据 @@ -1932,6 +1952,61 @@ 实体的属性配置 + + + 更新的实体 + + + + + 执行 ExecuteIdentity 方法时有效 + + + + + 实体类型 + + + + + 执行的 SQL + + + + + 参数化命令 + + + + + 执行 ExecuteAffrows 方法时有效 + + + + + 执行 ExecuteDeleted 方法时有效 + + + + + 实体类型 + + + + + 执行的 SQL + + + + + 参数化命令 + + + + + 查询返回的对象 + + 缓存数据时序列化方法,若无设置则默认使用 Json.net diff --git a/FreeSql/Interface/IAop.cs b/FreeSql/Interface/IAop.cs index 9559bc61..d27d2326 100644 --- a/FreeSql/Interface/IAop.cs +++ b/FreeSql/Interface/IAop.cs @@ -2,6 +2,7 @@ using FreeSql.DatabaseModel; using System; using System.Collections.Generic; +using System.Data.Common; using System.Linq.Expressions; using System.Reflection; @@ -31,6 +32,23 @@ namespace FreeSql { /// 自定义实体的属性配置,方便和多个 ORM 共同使用 /// EventHandler ConfigEntityProperty { get; set; } + + /// + /// IUpdate 执行成功后触发 + /// + EventHandler OnUpdated { get; set; } + /// + /// IInsert 执行成功后触发 + /// + EventHandler OnInserted { get; set; } + /// + /// IDeleted 执行成功后触发 + /// + EventHandler OnDeleted { get; set; } + /// + /// ISelect 执行成功后触发 + /// + EventHandler OnSelected { get; set; } } public class AopToListEventArgs : EventArgs { @@ -107,4 +125,84 @@ namespace FreeSql { /// public ColumnAttribute ModifyResult { get; } } + + public class AopOnUpdatedEventArgs : AopOnDeletedEventArgs { + public AopOnUpdatedEventArgs(Type entityType, object source, string sql, DbParameter[] dbParms, int affrows, object returning) + : base(entityType, sql, dbParms, affrows, returning) { + this.Source = source; + } + + /// + /// 更新的实体 + /// + public object Source { get; } + } + public class AopOnInsertedEventArgs : AopOnUpdatedEventArgs { + public AopOnInsertedEventArgs(Type entityType, object source, string sql, DbParameter[] dbParms, int affrows, long identity, object returning) + : base(entityType, source, sql, dbParms, affrows, returning) { + this.Identity = identity; + } + + /// + /// 执行 ExecuteIdentity 方法时有效 + /// + public long? Identity { get; set; } + } + + public class AopOnDeletedEventArgs : EventArgs { + public AopOnDeletedEventArgs(Type entityType, string sql, DbParameter[] dbParms, int affrows, object returning) { + this.EntityType = entityType; + this.Sql = sql; + this.DbParms = dbParms; + this.Affrows = affrows; + this.Returning = returning; + } + + /// + /// 实体类型 + /// + public Type EntityType { get; } + /// + /// 执行的 SQL + /// + public string Sql { get; } + /// + /// 参数化命令 + /// + public DbParameter[] DbParms { get; } + /// + /// 执行 ExecuteAffrows 方法时有效 + /// + public int Affrows { get; } + /// + /// 执行 ExecuteDeleted 方法时有效 + /// + public object Returning { get; } + } + + public class AopOnSelectedEventArgs : EventArgs { + public AopOnSelectedEventArgs(Type entityType, string sql, DbParameter[] dbParms, object returnData) { + this.EntityType = entityType; + this.Sql = sql; + this.DbParms = dbParms; + this.ReturnData = returnData; + } + + /// + /// 实体类型 + /// + public Type EntityType { get; } + /// + /// 执行的 SQL + /// + public string Sql { get; } + /// + /// 参数化命令 + /// + public DbParameter[] DbParms { get; } + /// + /// 查询返回的对象 + /// + public object ReturnData { get; } + } } diff --git a/FreeSql/Internal/CommonProvider/AopProvider.cs b/FreeSql/Internal/CommonProvider/AopProvider.cs index d8f856a2..98cca135 100644 --- a/FreeSql/Internal/CommonProvider/AopProvider.cs +++ b/FreeSql/Internal/CommonProvider/AopProvider.cs @@ -11,5 +11,9 @@ namespace FreeSql.Internal.CommonProvider { public EventHandler ParseExpression { get; set; } public EventHandler ConfigEntity { get; set; } public EventHandler ConfigEntityProperty { get; set; } + public EventHandler OnUpdated { get; set; } + public EventHandler OnInserted { get; set; } + public EventHandler OnDeleted { get; set; } + public EventHandler OnSelected { get; set; } } } diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 68de86c1..25292bf7 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -13,7 +13,6 @@ namespace FreeSql.Internal.CommonProvider { protected IFreeSql _orm; protected CommonUtils _commonUtils; protected CommonExpression _commonExpression; - protected List _source = new List(); protected TableInfo _table; protected Func _tableRule; protected StringBuilder _where = new StringBuilder(); @@ -32,7 +31,6 @@ namespace FreeSql.Internal.CommonProvider { } protected void ClearData() { - _source.Clear(); _where.Clear(); _whereTimes = 0; _params.Clear(); @@ -52,14 +50,18 @@ namespace FreeSql.Internal.CommonProvider { public int ExecuteAffrows() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params.ToArray()); + var dbParms = _params.ToArray(); + var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, affrows, null)); this.ClearData(); return affrows; } async public Task ExecuteAffrowsAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params.ToArray()); + var dbParms = _params.ToArray(); + var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, affrows, null)); this.ClearData(); return affrows; } diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 65effd37..9935a05d 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -323,8 +323,18 @@ namespace FreeSql.Internal.CommonProvider { } #endregion - internal int RawExecuteAffrows() => _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, ToSql(), _params); - internal Task RawExecuteAffrowsAsync() => _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, ToSql(), _params); + internal int RawExecuteAffrows() { + var sql = ToSql(); + var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, affrows, 0, null)); + return affrows; + } + async internal Task RawExecuteAffrowsAsync() { + var sql = ToSql(); + var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, affrows, 0, null)); + return affrows; + } internal abstract long RawExecuteIdentity(); internal abstract Task RawExecuteIdentityAsync(); internal abstract List RawExecuteInserted(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 2086b899..fa7e9524 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -215,15 +215,23 @@ namespace FreeSql.Internal.CommonProvider { var sql = this.ToSql(field); if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - return _orm.Cache.Shell(_cache.key, _cache.seconds, () => - _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, _params.ToArray())); + return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { + var dbParms = _params.ToArray(); + var ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); + return ret; + }); } public Task ToDataTableAsync(string field = null) { var sql = this.ToSql(field); if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () => - _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, _params.ToArray())); + return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { + var dbParms = _params.ToArray(); + var ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); + return ret; + }); } public List ToList(string field) { @@ -231,12 +239,14 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - List ret = new List(); - Type type = typeof(TTuple); + var ret = new List(); + var type = typeof(TTuple); + var dbParms = _params.ToArray(); _orm.Ado.ExecuteReader(_connection, _transaction, dr => { var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils); ret.Add((TTuple) read.Value); - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -247,13 +257,15 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - List ret = new List(); - Type type = typeof(TTuple); + var ret = new List(); + var type = typeof(TTuple); + var dbParms = _params.ToArray(); await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils); ret.Add((TTuple) read.Value); return Task.CompletedTask; - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -264,10 +276,12 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - List ret = new List(); + var ret = new List(); + var dbParms = _params.ToArray(); _orm.Ado.ExecuteReader(_connection, _transaction, dr => { ret.Add(af.Read(_orm, dr)); - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -278,11 +292,13 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - List ret = new List(); + var ret = new List(); + var dbParms = _params.ToArray(); await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { ret.Add(af.Read(_orm, dr)); return Task.CompletedTask; - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -309,12 +325,14 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - List ret = new List(); - Type type = typeof(TReturn); + var ret = new List(); + var type = typeof(TReturn); + var dbParms = _params.ToArray(); _orm.Ado.ExecuteReader(_connection, _transaction, dr => { var index = -1; ret.Add((TReturn) _commonExpression.ReadAnonymous(af.map, dr, ref index, false)); - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -325,13 +343,15 @@ namespace FreeSql.Internal.CommonProvider { if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - List ret = new List(); - Type type = typeof(TReturn); + var ret = new List(); + var type = typeof(TReturn); + var dbParms = _params.ToArray(); await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { var index = -1; ret.Add((TReturn) _commonExpression.ReadAnonymous(af.map, dr, ref index, false)); return Task.CompletedTask; - }, CommandType.Text, sql, _params.ToArray()); + }, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); return ret; @@ -709,8 +729,20 @@ namespace FreeSql.Internal.CommonProvider { return this.ToSql(af.field); } - protected DataTable InternalToDataTable(Expression select) => _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, this.InternalToSql(select), _params.ToArray()); - protected Task InternalToDataTableAsync(Expression select) => _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, this.InternalToSql(select), _params.ToArray()); + protected DataTable InternalToDataTable(Expression select) { + var sql = this.InternalToSql(select); + var dbParms = _params.ToArray(); + var ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); + return ret; + } + async protected Task InternalToDataTableAsync(Expression select) { + var sql = this.InternalToSql(select); + var dbParms = _params.ToArray(); + var ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret)); + return ret; + } protected TReturn InternalToAggregate(Expression select) { var map = new ReadAnonymousTypeInfo(); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 1e40807c..f4822b1b 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -239,14 +239,18 @@ namespace FreeSql.Internal.CommonProvider { internal int RawExecuteAffrows() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params.Concat(_paramsSource).ToArray()); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, null, sql, dbParms, affrows, 0, null)); ValidateVersionAndThrow(affrows); return affrows; } async internal Task RawExecuteAffrowsAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params.Concat(_paramsSource).ToArray()); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, null, sql, dbParms, affrows, 0, null)); ValidateVersionAndThrow(affrows); return affrows; } diff --git a/FreeSql/MySql/Curd/MySqlDelete.cs b/FreeSql/MySql/Curd/MySqlDelete.cs index 02360394..9157b521 100644 --- a/FreeSql/MySql/Curd/MySqlDelete.cs +++ b/FreeSql/MySql/Curd/MySqlDelete.cs @@ -24,7 +24,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } @@ -41,7 +44,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } diff --git a/FreeSql/MySql/Curd/MySqlInsert.cs b/FreeSql/MySql/Curd/MySqlInsert.cs index 55d24548..29560a7d 100644 --- a/FreeSql/MySql/Curd/MySqlInsert.cs +++ b/FreeSql/MySql/Curd/MySqlInsert.cs @@ -23,13 +23,19 @@ namespace FreeSql.MySql.Curd { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT LAST_INSERT_ID();"); + var ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng) ? trylng : 0; + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, ret, null)); + return ret; } async internal override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT LAST_INSERT_ID();"); + var ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng) ? trylng : 0; + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, ret, null)); + return ret; } internal override List RawExecuteInserted() { var sql = this.ToSql(); @@ -44,7 +50,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - return _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } async internal override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -59,7 +68,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - return await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } } } diff --git a/FreeSql/MySql/Curd/MySqlUpdate.cs b/FreeSql/MySql/Curd/MySqlUpdate.cs index 789265e2..2b2dfb55 100644 --- a/FreeSql/MySql/Curd/MySqlUpdate.cs +++ b/FreeSql/MySql/Curd/MySqlUpdate.cs @@ -33,7 +33,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } @@ -50,7 +53,10 @@ namespace FreeSql.MySql.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } diff --git a/FreeSql/Oracle/Curd/OracleInsert.cs b/FreeSql/Oracle/Curd/OracleInsert.cs index c484fb8d..943c3210 100644 --- a/FreeSql/Oracle/Curd/OracleInsert.cs +++ b/FreeSql/Oracle/Curd/OracleInsert.cs @@ -86,13 +86,18 @@ namespace FreeSql.Oracle.Curd { if (_identCol == null || _source.Count > 1) { _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, null)); return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0) as OracleParameter; identParam.Direction = ParameterDirection.Output; - _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}", _params.Concat(new[] { identParam }).ToArray()); - return long.TryParse(string.Concat(identParam.Value), out var trylng) ? trylng : 0; + sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; + var dbParms = _params.Concat(new[] { identParam }).ToArray(); + _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms); + long.TryParse(string.Concat(identParam.Value), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, dbParms, 0, trylng, null)); + return trylng; } async internal override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -100,13 +105,18 @@ namespace FreeSql.Oracle.Curd { if (_identCol == null || _source.Count > 1) { await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, null)); return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0) as OracleParameter; identParam.Direction = ParameterDirection.Output; - await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}", _params.Concat(new[] { identParam }).ToArray()); - return long.TryParse(string.Concat(identParam.Value), out var trylng) ? trylng : 0; + sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; + var dbParms = _params.Concat(new[] { identParam }).ToArray(); + await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + long.TryParse(string.Concat(identParam.Value), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, dbParms, 0, trylng, null)); + return trylng; } internal override List RawExecuteInserted() { diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs index 14ec2b3e..f685812b 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs @@ -24,7 +24,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } @@ -41,7 +44,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs index bb320199..0bdc836a 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs @@ -27,9 +27,13 @@ namespace FreeSql.PostgreSQL.Curd { var identCols = _table.Columns.Where(a => a.Value.Attribute.IsIdentity == true); if (identCols.Any() == false) { _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, null)); return 0; } - return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)); + long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } async internal override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -38,9 +42,13 @@ namespace FreeSql.PostgreSQL.Curd { var identCols = _table.Columns.Where(a => a.Value.Attribute.IsIdentity == true); if (identCols.Any() == false) { await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, null)); return 0; } - return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)); + long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } internal override List RawExecuteInserted() { @@ -56,7 +64,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - return _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } async internal override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -71,7 +82,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - return await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } } } diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs index 7b2ca281..09bcf447 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs @@ -33,7 +33,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } @@ -50,7 +53,10 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } diff --git a/FreeSql/SqlServer/Curd/SqlServerDelete.cs b/FreeSql/SqlServer/Curd/SqlServerDelete.cs index b4d55304..c1f48a42 100644 --- a/FreeSql/SqlServer/Curd/SqlServerDelete.cs +++ b/FreeSql/SqlServer/Curd/SqlServerDelete.cs @@ -30,7 +30,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx)); sb.Append(sql.Substring(validx)); - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } @@ -52,7 +55,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx)); sb.Append(sql.Substring(validx)); - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.ToArray()); + sql = sb.ToString(); + var dbParms = _params.ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, 0, ret)); this.ClearData(); return ret; } diff --git a/FreeSql/SqlServer/Curd/SqlServerInsert.cs b/FreeSql/SqlServer/Curd/SqlServerInsert.cs index e778aaad..b934852d 100644 --- a/FreeSql/SqlServer/Curd/SqlServerInsert.cs +++ b/FreeSql/SqlServer/Curd/SqlServerInsert.cs @@ -26,13 +26,19 @@ namespace FreeSql.SqlServer.Curd { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); + long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } async internal override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); + long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } internal override List RawExecuteInserted() { @@ -53,7 +59,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx + 1)); sb.Append(sql.Substring(validx + 1)); - return _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } async internal override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -73,7 +82,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx + 1)); sb.Append(sql.Substring(validx + 1)); - return await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params); + sql = sb.ToString(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, 0, ret)); + return ret; } } } \ No newline at end of file diff --git a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs b/FreeSql/SqlServer/Curd/SqlServerUpdate.cs index efebc39e..b9268e7a 100644 --- a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs +++ b/FreeSql/SqlServer/Curd/SqlServerUpdate.cs @@ -39,7 +39,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx)); sb.Append(sql.Substring(validx)); - var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } @@ -61,7 +64,10 @@ namespace FreeSql.SqlServer.Curd { sb.Insert(0, sql.Substring(0, validx)); sb.Append(sql.Substring(validx)); - var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + _orm.Aop.OnUpdated?.Invoke(this, new AopOnUpdatedEventArgs(_table.Type, _source, sql, dbParms, 0, ret)); ValidateVersionAndThrow(ret.Count); return ret; } diff --git a/FreeSql/Sqlite/Curd/SqliteInsert.cs b/FreeSql/Sqlite/Curd/SqliteInsert.cs index 38e5c654..2244021b 100644 --- a/FreeSql/Sqlite/Curd/SqliteInsert.cs +++ b/FreeSql/Sqlite/Curd/SqliteInsert.cs @@ -25,13 +25,19 @@ namespace FreeSql.Sqlite.Curd { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT last_insert_rowid();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT last_insert_rowid();"); + long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } async internal override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; - return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, string.Concat(sql, "; SELECT last_insert_rowid();"), _params)), out var trylng) ? trylng : 0; + sql = string.Concat(sql, "; SELECT last_insert_rowid();"); + long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng); + _orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, 0, trylng, null)); + return trylng; } internal override List RawExecuteInserted() { var sql = this.ToSql();