mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
rename DbContext Internal Method
This commit is contained in:
parent
0154600d0a
commit
bd79fc803e
@ -225,7 +225,7 @@ namespace FreeSql
|
|||||||
#endif
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Queue Action
|
#region Queue PreCommand
|
||||||
public class EntityChangeReport
|
public class EntityChangeReport
|
||||||
{
|
{
|
||||||
public class ChangeInfo
|
public class ChangeInfo
|
||||||
@ -244,7 +244,7 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
internal List<EntityChangeReport.ChangeInfo> _entityChangeReport = new List<EntityChangeReport.ChangeInfo>();
|
internal List<EntityChangeReport.ChangeInfo> _entityChangeReport = new List<EntityChangeReport.ChangeInfo>();
|
||||||
public enum EntityChangeType { Insert, Update, Delete, SqlRaw }
|
public enum EntityChangeType { Insert, Update, Delete, SqlRaw }
|
||||||
internal class ExecCommandInfo
|
internal class PrevCommandInfo
|
||||||
{
|
{
|
||||||
public EntityChangeType changeType { get; set; }
|
public EntityChangeType changeType { get; set; }
|
||||||
public IDbSet dbSet { get; set; }
|
public IDbSet dbSet { get; set; }
|
||||||
@ -252,11 +252,11 @@ namespace FreeSql
|
|||||||
public Type entityType { get; set; }
|
public Type entityType { get; set; }
|
||||||
public object state { get; set; }
|
public object state { get; set; }
|
||||||
}
|
}
|
||||||
Queue<ExecCommandInfo> _actions = new Queue<ExecCommandInfo>();
|
Queue<PrevCommandInfo> _prevCommands = new Queue<PrevCommandInfo>();
|
||||||
internal int _affrows = 0;
|
internal int _affrows = 0;
|
||||||
|
|
||||||
internal void EnqueueAction(EntityChangeType changeType, IDbSet dbSet, Type stateType, Type entityType, object state) =>
|
internal void EnqueuePreCommand(EntityChangeType changeType, IDbSet dbSet, Type stateType, Type entityType, object state) =>
|
||||||
_actions.Enqueue(new ExecCommandInfo { changeType = changeType, dbSet = dbSet, stateType = stateType, entityType = entityType, state = state });
|
_prevCommands.Enqueue(new PrevCommandInfo { changeType = changeType, dbSet = dbSet, stateType = stateType, entityType = entityType, state = state });
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
~DbContext() => this.Dispose();
|
~DbContext() => this.Dispose();
|
||||||
@ -266,7 +266,7 @@ namespace FreeSql
|
|||||||
if (Interlocked.Increment(ref _disposeCounter) != 1) return;
|
if (Interlocked.Increment(ref _disposeCounter) != 1) return;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_actions.Clear();
|
_prevCommands.Clear();
|
||||||
|
|
||||||
foreach (var set in _listSet)
|
foreach (var set in _listSet)
|
||||||
try
|
try
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
#if net40
|
#if net40
|
||||||
@ -13,25 +14,25 @@ namespace FreeSql
|
|||||||
{
|
{
|
||||||
async public virtual Task<int> SaveChangesAsync()
|
async public virtual Task<int> SaveChangesAsync()
|
||||||
{
|
{
|
||||||
await ExecCommandAsync();
|
await FlushCommandAsync();
|
||||||
return SaveChangesSuccess();
|
return SaveChangesSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Dictionary<Type, Dictionary<string, Func<object, object[], Task<int>>>> _dicExecCommandDbContextBatchAsync = new Dictionary<Type, Dictionary<string, Func<object, object[], Task<int>>>>();
|
static ConcurrentDictionary<Type, ConcurrentDictionary<string, Func<object, object[], Task<int>>>> _dicFlushCommandDbSetBatchAsync = new ConcurrentDictionary<Type, ConcurrentDictionary<string, Func<object, object[], Task<int>>>>();
|
||||||
async internal Task ExecCommandAsync()
|
async internal Task FlushCommandAsync()
|
||||||
{
|
{
|
||||||
if (isExecCommanding) return;
|
if (isFlushCommanding) return;
|
||||||
if (_actions.Any() == false) return;
|
if (_prevCommands.Any() == false) return;
|
||||||
isExecCommanding = true;
|
isFlushCommanding = true;
|
||||||
|
|
||||||
ExecCommandInfo oldinfo = null;
|
PrevCommandInfo oldinfo = null;
|
||||||
var states = new List<object>();
|
var states = new List<object>();
|
||||||
|
|
||||||
Func<string, Task<int>> dbContextBatch = methodName =>
|
Task<int> dbsetBatch(string method)
|
||||||
{
|
{
|
||||||
if (_dicExecCommandDbContextBatchAsync.TryGetValue(oldinfo.stateType, out var trydic) == false)
|
var tryfunc = _dicFlushCommandDbSetBatchAsync
|
||||||
trydic = new Dictionary<string, Func<object, object[], Task<int>>>();
|
.GetOrAdd(oldinfo.stateType, stateType => new ConcurrentDictionary<string, Func<object, object[], Task<int>>>())
|
||||||
if (trydic.TryGetValue(methodName, out var tryfunc) == false)
|
.GetOrAdd(method, methodName =>
|
||||||
{
|
{
|
||||||
var arrType = oldinfo.stateType.MakeArrayType();
|
var arrType = oldinfo.stateType.MakeArrayType();
|
||||||
var dbsetType = oldinfo.dbSet.GetType().BaseType;
|
var dbsetType = oldinfo.dbSet.GetType().BaseType;
|
||||||
@ -41,31 +42,30 @@ namespace FreeSql
|
|||||||
var parm1DbSet = Expression.Parameter(typeof(object));
|
var parm1DbSet = Expression.Parameter(typeof(object));
|
||||||
var parm2Vals = Expression.Parameter(typeof(object[]));
|
var parm2Vals = Expression.Parameter(typeof(object[]));
|
||||||
var var1Vals = Expression.Variable(arrType);
|
var var1Vals = Expression.Variable(arrType);
|
||||||
tryfunc = Expression.Lambda<Func<object, object[], Task<int>>>(Expression.Block(
|
return Expression.Lambda<Func<object, object[], Task<int>>>(Expression.Block(
|
||||||
new[] { var1Vals },
|
new[] { var1Vals },
|
||||||
Expression.Assign(var1Vals, Expression.Convert(global::FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(arrType, parm2Vals), arrType)),
|
Expression.Assign(var1Vals, Expression.Convert(global::FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(arrType, parm2Vals), arrType)),
|
||||||
Expression.Return(returnTarget, Expression.Call(Expression.Convert(parm1DbSet, dbsetType), dbsetTypeMethod, var1Vals)),
|
Expression.Return(returnTarget, Expression.Call(Expression.Convert(parm1DbSet, dbsetType), dbsetTypeMethod, var1Vals)),
|
||||||
Expression.Label(returnTarget, Expression.Default(typeof(Task<int>)))
|
Expression.Label(returnTarget, Expression.Default(typeof(Task<int>)))
|
||||||
), new[] { parm1DbSet, parm2Vals }).Compile();
|
), new[] { parm1DbSet, parm2Vals }).Compile();
|
||||||
trydic.Add(methodName, tryfunc);
|
});
|
||||||
}
|
|
||||||
return tryfunc(oldinfo.dbSet, states.ToArray());
|
return tryfunc(oldinfo.dbSet, states.ToArray());
|
||||||
};
|
}
|
||||||
Func<Task> funcDelete = async () =>
|
async Task funcDelete()
|
||||||
{
|
{
|
||||||
_affrows += await dbContextBatch("DbContextBatchRemoveAsync");
|
_affrows += await dbsetBatch("DbContextBatchRemoveAsync");
|
||||||
|
states.Clear();
|
||||||
|
}
|
||||||
|
async Task funcInsert()
|
||||||
|
{
|
||||||
|
_affrows += await dbsetBatch("DbContextBatchAddAsync");
|
||||||
states.Clear();
|
states.Clear();
|
||||||
};
|
};
|
||||||
Func<Task> funcInsert = async () =>
|
async Task funcUpdate(bool isLiveUpdate)
|
||||||
{
|
|
||||||
_affrows += await dbContextBatch("DbContextBatchAddAsync");
|
|
||||||
states.Clear();
|
|
||||||
};
|
|
||||||
Func<bool, Task> funcUpdate = async (isLiveUpdate) =>
|
|
||||||
{
|
{
|
||||||
var affrows = 0;
|
var affrows = 0;
|
||||||
if (isLiveUpdate) affrows = await dbContextBatch("DbContextBatchUpdateNowAsync");
|
if (isLiveUpdate) affrows = await dbsetBatch("DbContextBatchUpdateNowAsync");
|
||||||
else affrows = await dbContextBatch("DbContextBatchUpdateAsync");
|
else affrows = await dbsetBatch("DbContextBatchUpdateAsync");
|
||||||
if (affrows == -999)
|
if (affrows == -999)
|
||||||
{ //最后一个元素已被删除
|
{ //最后一个元素已被删除
|
||||||
states.RemoveAt(states.Count - 1);
|
states.RemoveAt(states.Count - 1);
|
||||||
@ -87,13 +87,13 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
while (_actions.Any() || states.Any())
|
while (_prevCommands.Any() || states.Any())
|
||||||
{
|
{
|
||||||
var info = _actions.Any() ? _actions.Dequeue() : null;
|
var info = _prevCommands.Any() ? _prevCommands.Dequeue() : null;
|
||||||
if (oldinfo == null) oldinfo = info;
|
if (oldinfo == null) oldinfo = info;
|
||||||
var isLiveUpdate = false;
|
var isLiveUpdate = false;
|
||||||
|
|
||||||
if (_actions.Any() == false && states.Any() ||
|
if (_prevCommands.Any() == false && states.Any() ||
|
||||||
info != null && oldinfo.changeType != info.changeType ||
|
info != null && oldinfo.changeType != info.changeType ||
|
||||||
info != null && oldinfo.stateType != info.stateType ||
|
info != null && oldinfo.stateType != info.stateType ||
|
||||||
info != null && oldinfo.entityType != info.entityType)
|
info != null && oldinfo.entityType != info.entityType)
|
||||||
@ -130,7 +130,7 @@ namespace FreeSql
|
|||||||
oldinfo = info;
|
oldinfo = info;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isExecCommanding = false;
|
isFlushCommanding = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,14 +35,14 @@ namespace FreeSql
|
|||||||
|
|
||||||
public ISelect<T1> Select<T1>() where T1 : class
|
public ISelect<T1> Select<T1>() where T1 : class
|
||||||
{
|
{
|
||||||
_resolveDbContext()?.ExecCommand();
|
_resolveDbContext()?.FlushCommand();
|
||||||
return _originalFsql.Select<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction(false));
|
return _originalFsql.Select<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction(false));
|
||||||
}
|
}
|
||||||
public ISelect<T1> Select<T1>(object dywhere) where T1 : class => Select<T1>().WhereDynamic(dywhere);
|
public ISelect<T1> Select<T1>(object dywhere) where T1 : class => Select<T1>().WhereDynamic(dywhere);
|
||||||
|
|
||||||
public IDelete<T1> Delete<T1>() where T1 : class
|
public IDelete<T1> Delete<T1>() where T1 : class
|
||||||
{
|
{
|
||||||
_resolveDbContext()?.ExecCommand();
|
_resolveDbContext()?.FlushCommand();
|
||||||
return _originalFsql.Delete<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
return _originalFsql.Delete<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
||||||
}
|
}
|
||||||
public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => Delete<T1>().WhereDynamic(dywhere);
|
public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => Delete<T1>().WhereDynamic(dywhere);
|
||||||
@ -50,7 +50,7 @@ namespace FreeSql
|
|||||||
public IUpdate<T1> Update<T1>() where T1 : class
|
public IUpdate<T1> Update<T1>() where T1 : class
|
||||||
{
|
{
|
||||||
var db = _resolveDbContext();
|
var db = _resolveDbContext();
|
||||||
db?.ExecCommand();
|
db?.FlushCommand();
|
||||||
var update = _originalFsql.Update<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
var update = _originalFsql.Update<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
||||||
if (db?.Options.NoneParameter != null) update.NoneParameter(db.Options.NoneParameter.Value);
|
if (db?.Options.NoneParameter != null) update.NoneParameter(db.Options.NoneParameter.Value);
|
||||||
return update;
|
return update;
|
||||||
@ -60,7 +60,7 @@ namespace FreeSql
|
|||||||
public IInsert<T1> Insert<T1>() where T1 : class
|
public IInsert<T1> Insert<T1>() where T1 : class
|
||||||
{
|
{
|
||||||
var db = _resolveDbContext();
|
var db = _resolveDbContext();
|
||||||
db?.ExecCommand();
|
db?.FlushCommand();
|
||||||
var insert = _originalFsql.Insert<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
var insert = _originalFsql.Insert<T1>().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction());
|
||||||
if (db?.Options.NoneParameter != null) insert.NoneParameter(db.Options.NoneParameter.Value);
|
if (db?.Options.NoneParameter != null) insert.NoneParameter(db.Options.NoneParameter.Value);
|
||||||
return insert;
|
return insert;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace FreeSql
|
namespace FreeSql
|
||||||
{
|
{
|
||||||
@ -26,26 +27,29 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
public virtual int SaveChanges()
|
public virtual int SaveChanges()
|
||||||
{
|
{
|
||||||
ExecCommand();
|
FlushCommand();
|
||||||
return SaveChangesSuccess();
|
return SaveChangesSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Dictionary<Type, Dictionary<string, Func<object, object[], int>>> _dicExecCommandDbContextBatch = new Dictionary<Type, Dictionary<string, Func<object, object[], int>>>();
|
static ConcurrentDictionary<Type, ConcurrentDictionary<string, Func<object, object[], int>>> _dicFlushCommandDbSetBatch = new ConcurrentDictionary<Type, ConcurrentDictionary<string, Func<object, object[], int>>>();
|
||||||
bool isExecCommanding = false;
|
bool isFlushCommanding = false;
|
||||||
internal void ExecCommand()
|
/// <summary>
|
||||||
|
/// 刷新队列中的命令
|
||||||
|
/// </summary>
|
||||||
|
internal void FlushCommand()
|
||||||
{
|
{
|
||||||
if (isExecCommanding) return;
|
if (isFlushCommanding) return;
|
||||||
if (_actions.Any() == false) return;
|
if (_prevCommands.Any() == false) return;
|
||||||
isExecCommanding = true;
|
isFlushCommanding = true;
|
||||||
|
|
||||||
ExecCommandInfo oldinfo = null;
|
PrevCommandInfo oldinfo = null;
|
||||||
var states = new List<object>();
|
var states = new List<object>();
|
||||||
|
|
||||||
Func<string, int> dbContextBatch = methodName =>
|
int dbsetBatch(string method)
|
||||||
{
|
{
|
||||||
if (_dicExecCommandDbContextBatch.TryGetValue(oldinfo.stateType, out var trydic) == false)
|
var tryfunc = _dicFlushCommandDbSetBatch
|
||||||
trydic = new Dictionary<string, Func<object, object[], int>>();
|
.GetOrAdd(oldinfo.stateType, stateType => new ConcurrentDictionary<string, Func<object, object[], int>>())
|
||||||
if (trydic.TryGetValue(methodName, out var tryfunc) == false)
|
.GetOrAdd(method, methodName =>
|
||||||
{
|
{
|
||||||
var arrType = oldinfo.stateType.MakeArrayType();
|
var arrType = oldinfo.stateType.MakeArrayType();
|
||||||
var dbsetType = oldinfo.dbSet.GetType().BaseType;
|
var dbsetType = oldinfo.dbSet.GetType().BaseType;
|
||||||
@ -55,31 +59,30 @@ namespace FreeSql
|
|||||||
var parm1DbSet = Expression.Parameter(typeof(object));
|
var parm1DbSet = Expression.Parameter(typeof(object));
|
||||||
var parm2Vals = Expression.Parameter(typeof(object[]));
|
var parm2Vals = Expression.Parameter(typeof(object[]));
|
||||||
var var1Vals = Expression.Variable(arrType);
|
var var1Vals = Expression.Variable(arrType);
|
||||||
tryfunc = Expression.Lambda<Func<object, object[], int>>(Expression.Block(
|
return Expression.Lambda<Func<object, object[], int>>(Expression.Block(
|
||||||
new[] { var1Vals },
|
new[] { var1Vals },
|
||||||
Expression.Assign(var1Vals, Expression.Convert(global::FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(arrType, parm2Vals), arrType)),
|
Expression.Assign(var1Vals, Expression.Convert(global::FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(arrType, parm2Vals), arrType)),
|
||||||
Expression.Return(returnTarget, Expression.Call(Expression.Convert(parm1DbSet, dbsetType), dbsetTypeMethod, var1Vals)),
|
Expression.Return(returnTarget, Expression.Call(Expression.Convert(parm1DbSet, dbsetType), dbsetTypeMethod, var1Vals)),
|
||||||
Expression.Label(returnTarget, Expression.Default(typeof(int)))
|
Expression.Label(returnTarget, Expression.Default(typeof(int)))
|
||||||
), new[] { parm1DbSet, parm2Vals }).Compile();
|
), new[] { parm1DbSet, parm2Vals }).Compile();
|
||||||
trydic.Add(methodName, tryfunc);
|
});
|
||||||
}
|
|
||||||
return tryfunc(oldinfo.dbSet, states.ToArray());
|
return tryfunc(oldinfo.dbSet, states.ToArray());
|
||||||
};
|
}
|
||||||
Action funcDelete = () =>
|
void funcDelete()
|
||||||
{
|
{
|
||||||
_affrows += dbContextBatch("DbContextBatchRemove");
|
_affrows += dbsetBatch("DbContextBatchRemove");
|
||||||
|
states.Clear();
|
||||||
|
}
|
||||||
|
void funcInsert()
|
||||||
|
{
|
||||||
|
_affrows += dbsetBatch("DbContextBatchAdd");
|
||||||
states.Clear();
|
states.Clear();
|
||||||
};
|
};
|
||||||
Action funcInsert = () =>
|
void funcUpdate(bool isLiveUpdate)
|
||||||
{
|
|
||||||
_affrows += dbContextBatch("DbContextBatchAdd");
|
|
||||||
states.Clear();
|
|
||||||
};
|
|
||||||
Action<bool> funcUpdate = isLiveUpdate =>
|
|
||||||
{
|
{
|
||||||
var affrows = 0;
|
var affrows = 0;
|
||||||
if (isLiveUpdate) affrows = dbContextBatch("DbContextBatchUpdateNow");
|
if (isLiveUpdate) affrows = dbsetBatch("DbContextBatchUpdateNow");
|
||||||
else affrows = dbContextBatch("DbContextBatchUpdate");
|
else affrows = dbsetBatch("DbContextBatchUpdate");
|
||||||
if (affrows == -999)
|
if (affrows == -999)
|
||||||
{ //最后一个元素已被删除
|
{ //最后一个元素已被删除
|
||||||
states.RemoveAt(states.Count - 1);
|
states.RemoveAt(states.Count - 1);
|
||||||
@ -101,13 +104,13 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
while (_actions.Any() || states.Any())
|
while (_prevCommands.Any() || states.Any())
|
||||||
{
|
{
|
||||||
var info = _actions.Any() ? _actions.Dequeue() : null;
|
var info = _prevCommands.Any() ? _prevCommands.Dequeue() : null;
|
||||||
if (oldinfo == null) oldinfo = info;
|
if (oldinfo == null) oldinfo = info;
|
||||||
var isLiveUpdate = false;
|
var isLiveUpdate = false;
|
||||||
|
|
||||||
if (_actions.Any() == false && states.Any() ||
|
if (_prevCommands.Any() == false && states.Any() ||
|
||||||
info != null && oldinfo.changeType != info.changeType ||
|
info != null && oldinfo.changeType != info.changeType ||
|
||||||
info != null && oldinfo.stateType != info.stateType ||
|
info != null && oldinfo.stateType != info.stateType ||
|
||||||
info != null && oldinfo.entityType != info.entityType)
|
info != null && oldinfo.entityType != info.entityType)
|
||||||
@ -144,7 +147,7 @@ namespace FreeSql
|
|||||||
oldinfo = info;
|
oldinfo = info;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isExecCommanding = false;
|
isFlushCommanding = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ namespace FreeSql
|
|||||||
|
|
||||||
protected virtual ISelect<TEntity> OrmSelect(object dywhere)
|
protected virtual ISelect<TEntity> OrmSelect(object dywhere)
|
||||||
{
|
{
|
||||||
DbContextExecCommand(); //查询前先提交,否则会出脏读
|
DbContextFlushCommand(); //查询前先提交,否则会出脏读
|
||||||
return _db.OrmOriginal.Select<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction(false)).TrackToList(TrackToList).WhereDynamic(dywhere);
|
return _db.OrmOriginal.Select<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction(false)).TrackToList(TrackToList).WhereDynamic(dywhere);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ namespace FreeSql
|
|||||||
protected virtual IDelete<TEntity> OrmDelete(object dywhere) => _db.OrmOriginal.Delete<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere);
|
protected virtual IDelete<TEntity> OrmDelete(object dywhere) => _db.OrmOriginal.Delete<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere);
|
||||||
|
|
||||||
internal void EnqueueToDbContext(DbContext.EntityChangeType changeType, EntityState state) =>
|
internal void EnqueueToDbContext(DbContext.EntityChangeType changeType, EntityState state) =>
|
||||||
_db.EnqueueAction(changeType, this, typeof(EntityState), _entityType, state);
|
_db.EnqueuePreCommand(changeType, this, typeof(EntityState), _entityType, state);
|
||||||
|
|
||||||
internal void IncrAffrows(int affrows) =>
|
internal void IncrAffrows(int affrows) =>
|
||||||
_db._affrows += affrows;
|
_db._affrows += affrows;
|
||||||
|
@ -14,10 +14,10 @@ namespace FreeSql
|
|||||||
{
|
{
|
||||||
partial class DbSet<TEntity>
|
partial class DbSet<TEntity>
|
||||||
{
|
{
|
||||||
Task DbContextExecCommandAsync()
|
Task DbContextFlushCommandAsync()
|
||||||
{
|
{
|
||||||
_dicUpdateTimes.Clear();
|
_dicUpdateTimes.Clear();
|
||||||
return _db.ExecCommandAsync();
|
return _db.FlushCommandAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task<int> DbContextBatchAddAsync(EntityState[] adds)
|
async Task<int> DbContextBatchAddAsync(EntityState[] adds)
|
||||||
@ -43,7 +43,7 @@ namespace FreeSql
|
|||||||
case DataType.OdbcPostgreSQL:
|
case DataType.OdbcPostgreSQL:
|
||||||
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
|
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
|
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
||||||
@ -54,7 +54,7 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First();
|
var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First();
|
||||||
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
|
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
@ -67,7 +67,7 @@ namespace FreeSql
|
|||||||
default:
|
default:
|
||||||
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
|
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
|
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
||||||
@ -102,7 +102,7 @@ namespace FreeSql
|
|||||||
case DataType.OdbcSqlServer:
|
case DataType.OdbcSqlServer:
|
||||||
case DataType.PostgreSQL:
|
case DataType.PostgreSQL:
|
||||||
case DataType.OdbcPostgreSQL:
|
case DataType.OdbcPostgreSQL:
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var rets = await this.OrmInsert(data).ExecuteInsertedAsync();
|
var rets = await this.OrmInsert(data).ExecuteInsertedAsync();
|
||||||
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.OrmOriginal.Ado.DataType} 的返回数据,与添加的数目不匹配");
|
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.OrmOriginal.Ado.DataType} 的返回数据,与添加的数目不匹配");
|
||||||
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
|
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
|
||||||
@ -149,7 +149,7 @@ namespace FreeSql
|
|||||||
throw new ArgumentException($"{_table.Type.FullName} 类型的属性 {propertyName} 不是 OneToMany 或 ManyToMany 特性");
|
throw new ArgumentException($"{_table.Type.FullName} 类型的属性 {propertyName} 不是 OneToMany 或 ManyToMany 特性");
|
||||||
}
|
}
|
||||||
|
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
|
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
|
||||||
_db.Options.EnableAddOrUpdateNavigateList = false;
|
_db.Options.EnableAddOrUpdateNavigateList = false;
|
||||||
try
|
try
|
||||||
@ -157,7 +157,7 @@ namespace FreeSql
|
|||||||
await AddOrUpdateNavigateListAsync(item, false, propertyName);
|
await AddOrUpdateNavigateListAsync(item, false, propertyName);
|
||||||
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
|
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
//删除没有保存的数据,求出主体的条件
|
//删除没有保存的数据,求出主体的条件
|
||||||
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
|
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
|
||||||
Expression whereParentExp = null;
|
Expression whereParentExp = null;
|
||||||
@ -401,7 +401,7 @@ namespace FreeSql
|
|||||||
foreach (var item in data)
|
foreach (var item in data)
|
||||||
{
|
{
|
||||||
if (_dicUpdateTimes.ContainsKey(item))
|
if (_dicUpdateTimes.ContainsKey(item))
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
_dicUpdateTimes.Add(item, 1);
|
_dicUpdateTimes.Add(item, 1);
|
||||||
|
|
||||||
var state = CreateEntityState(item);
|
var state = CreateEntityState(item);
|
||||||
@ -429,7 +429,7 @@ namespace FreeSql
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
async public Task<int> RemoveAsync(Expression<Func<TEntity, bool>> predicate)
|
async public Task<int> RemoveAsync(Expression<Func<TEntity, bool>> predicate)
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
return await this.OrmDelete(null).Where(predicate).ExecuteAffrowsAsync();
|
return await this.OrmDelete(null).Where(predicate).ExecuteAffrowsAsync();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@ -449,10 +449,10 @@ namespace FreeSql
|
|||||||
|
|
||||||
if (flagExists == true && CanUpdate(data, false))
|
if (flagExists == true && CanUpdate(data, false))
|
||||||
{
|
{
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
var affrows = _db._affrows;
|
var affrows = _db._affrows;
|
||||||
await UpdateRangePrivAsync(new[] { data }, false);
|
await UpdateRangePrivAsync(new[] { data }, false);
|
||||||
await DbContextExecCommandAsync();
|
await DbContextFlushCommandAsync();
|
||||||
affrows = _db._affrows - affrows;
|
affrows = _db._affrows - affrows;
|
||||||
if (affrows > 0) return;
|
if (affrows > 0) return;
|
||||||
}
|
}
|
||||||
|
@ -13,10 +13,10 @@ namespace FreeSql
|
|||||||
partial class DbSet<TEntity>
|
partial class DbSet<TEntity>
|
||||||
{
|
{
|
||||||
|
|
||||||
void DbContextExecCommand()
|
void DbContextFlushCommand()
|
||||||
{
|
{
|
||||||
_dicUpdateTimes.Clear();
|
_dicUpdateTimes.Clear();
|
||||||
_db.ExecCommand();
|
_db.FlushCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
int DbContextBatchAdd(EntityState[] adds)
|
int DbContextBatchAdd(EntityState[] adds)
|
||||||
@ -42,7 +42,7 @@ namespace FreeSql
|
|||||||
case DataType.OdbcPostgreSQL:
|
case DataType.OdbcPostgreSQL:
|
||||||
if (_tableIdentitys.Length == 1)
|
if (_tableIdentitys.Length == 1)
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var idtval = this.OrmInsert(data).ExecuteIdentity();
|
var idtval = this.OrmInsert(data).ExecuteIdentity();
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
||||||
@ -53,7 +53,7 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var newval = this.OrmInsert(data).ExecuteInserted().First();
|
var newval = this.OrmInsert(data).ExecuteInserted().First();
|
||||||
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
|
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
@ -66,7 +66,7 @@ namespace FreeSql
|
|||||||
default:
|
default:
|
||||||
if (_tableIdentitys.Length == 1)
|
if (_tableIdentitys.Length == 1)
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var idtval = this.OrmInsert(data).ExecuteIdentity();
|
var idtval = this.OrmInsert(data).ExecuteIdentity();
|
||||||
IncrAffrows(1);
|
IncrAffrows(1);
|
||||||
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
_db.OrmOriginal.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
|
||||||
@ -105,7 +105,7 @@ namespace FreeSql
|
|||||||
case DataType.OdbcSqlServer:
|
case DataType.OdbcSqlServer:
|
||||||
case DataType.PostgreSQL:
|
case DataType.PostgreSQL:
|
||||||
case DataType.OdbcPostgreSQL:
|
case DataType.OdbcPostgreSQL:
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var rets = this.OrmInsert(data).ExecuteInserted();
|
var rets = this.OrmInsert(data).ExecuteInserted();
|
||||||
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.OrmOriginal.Ado.DataType} 的返回数据,与添加的数目不匹配");
|
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.OrmOriginal.Ado.DataType} 的返回数据,与添加的数目不匹配");
|
||||||
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
|
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
|
||||||
@ -161,7 +161,7 @@ namespace FreeSql
|
|||||||
throw new ArgumentException($"{_table.Type.FullName} 类型的属性 {propertyName} 不是 OneToMany 或 ManyToMany 特性");
|
throw new ArgumentException($"{_table.Type.FullName} 类型的属性 {propertyName} 不是 OneToMany 或 ManyToMany 特性");
|
||||||
}
|
}
|
||||||
|
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
|
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
|
||||||
_db.Options.EnableAddOrUpdateNavigateList = false;
|
_db.Options.EnableAddOrUpdateNavigateList = false;
|
||||||
try
|
try
|
||||||
@ -169,7 +169,7 @@ namespace FreeSql
|
|||||||
AddOrUpdateNavigateList(item, false, propertyName);
|
AddOrUpdateNavigateList(item, false, propertyName);
|
||||||
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
|
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
//删除没有保存的数据,求出主体的条件
|
//删除没有保存的数据,求出主体的条件
|
||||||
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
|
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
|
||||||
Expression whereParentExp = null;
|
Expression whereParentExp = null;
|
||||||
@ -442,7 +442,7 @@ namespace FreeSql
|
|||||||
foreach (var item in data)
|
foreach (var item in data)
|
||||||
{
|
{
|
||||||
if (_dicUpdateTimes.ContainsKey(item))
|
if (_dicUpdateTimes.ContainsKey(item))
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
_dicUpdateTimes.Add(item, 1);
|
_dicUpdateTimes.Add(item, 1);
|
||||||
|
|
||||||
var state = CreateEntityState(item);
|
var state = CreateEntityState(item);
|
||||||
@ -488,7 +488,7 @@ namespace FreeSql
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int Remove(Expression<Func<TEntity, bool>> predicate)
|
public int Remove(Expression<Func<TEntity, bool>> predicate)
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
return this.OrmDelete(null).Where(predicate).ExecuteAffrows();
|
return this.OrmDelete(null).Where(predicate).ExecuteAffrows();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@ -512,10 +512,10 @@ namespace FreeSql
|
|||||||
|
|
||||||
if (flagExists == true && CanUpdate(data, false))
|
if (flagExists == true && CanUpdate(data, false))
|
||||||
{
|
{
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
var affrows = _db._affrows;
|
var affrows = _db._affrows;
|
||||||
UpdateRangePriv(new[] { data }, false);
|
UpdateRangePriv(new[] { data }, false);
|
||||||
DbContextExecCommand();
|
DbContextFlushCommand();
|
||||||
affrows = _db._affrows - affrows;
|
affrows = _db._affrows - affrows;
|
||||||
if (affrows > 0) return;
|
if (affrows > 0) return;
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,11 @@
|
|||||||
实体变化事件
|
实体变化事件
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.DbContext.FlushCommand">
|
||||||
|
<summary>
|
||||||
|
刷新队列中的命令
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList">
|
<member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList">
|
||||||
<summary>
|
<summary>
|
||||||
是否开启一对多,多对多级联保存功能<para></para>
|
是否开启一对多,多对多级联保存功能<para></para>
|
||||||
@ -115,6 +120,13 @@
|
|||||||
清空状态数据
|
清空状态数据
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
根据 lambda 条件删除数据
|
||||||
|
</summary>
|
||||||
|
<param name="predicate"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
||||||
<summary>
|
<summary>
|
||||||
添加
|
添加
|
||||||
|
@ -76,14 +76,14 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
public override int SaveChanges()
|
public override int SaveChanges()
|
||||||
{
|
{
|
||||||
ExecCommand();
|
FlushCommand();
|
||||||
return SaveChangesSuccess();
|
return SaveChangesSuccess();
|
||||||
}
|
}
|
||||||
#if net40
|
#if net40
|
||||||
#else
|
#else
|
||||||
async public override Task<int> SaveChangesAsync()
|
async public override Task<int> SaveChangesAsync()
|
||||||
{
|
{
|
||||||
await ExecCommandAsync();
|
await FlushCommandAsync();
|
||||||
return SaveChangesSuccess();
|
return SaveChangesSuccess();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user