[fix] 批量操作数据后,需要统一清空缓存。fix: https://github.com/NewLifeX/NewLife.XCode/issues/61
This commit is contained in:
parent
85485dab32
commit
44ef16c980
|
@ -456,6 +456,7 @@ public class SingleEntityCache<TKey, TEntity> : CacheBase<TEntity>, ISingleEntit
|
||||||
{
|
{
|
||||||
if (entity == null) return;
|
if (entity == null) return;
|
||||||
if (GetKeyMethod == null) return;
|
if (GetKeyMethod == null) return;
|
||||||
|
|
||||||
var key = GetKeyMethod(entity);
|
var key = GetKeyMethod(entity);
|
||||||
RemoveKey(key);
|
RemoveKey(key);
|
||||||
}
|
}
|
||||||
|
@ -472,10 +473,10 @@ public class SingleEntityCache<TKey, TEntity> : CacheBase<TEntity>, ISingleEntit
|
||||||
if (es == null) return;
|
if (es == null) return;
|
||||||
|
|
||||||
// 不要清空单对象缓存,而是设为过期
|
// 不要清空单对象缓存,而是设为过期
|
||||||
var now = TimerX.Now;
|
var exp = TimerX.Now.AddSeconds(-1);
|
||||||
foreach (var item in es)
|
foreach (var item in es)
|
||||||
{
|
{
|
||||||
item.Value.ExpireTime = now.AddSeconds(-1);
|
item.Value.ExpireTime = exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
Using = false;
|
Using = false;
|
||||||
|
|
|
@ -20,7 +20,6 @@ public static class EntityExtension
|
||||||
/// <param name="list">实体列表</param>
|
/// <param name="list">实体列表</param>
|
||||||
/// <param name="valueField">作为Value部分的字段,默认为空表示整个实体对象为值</param>
|
/// <param name="valueField">作为Value部分的字段,默认为空表示整个实体对象为值</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
//[Obsolete("将来不再支持实体列表,请改用Linq")]
|
|
||||||
public static IDictionary ToDictionary<T>(this IEnumerable<T> list, String? valueField = null) where T : IEntity
|
public static IDictionary ToDictionary<T>(this IEnumerable<T> list, String? valueField = null) where T : IEntity
|
||||||
{
|
{
|
||||||
if (list == null || !list.Any()) return new Dictionary<String, String>();
|
if (list == null || !list.Any()) return new Dictionary<String, String>();
|
||||||
|
@ -128,7 +127,7 @@ public static class EntityExtension
|
||||||
var session2 = session ?? fact.Session;
|
var session2 = session ?? fact.Session;
|
||||||
|
|
||||||
// Oracle/MySql批量插入
|
// Oracle/MySql批量插入
|
||||||
if (session2.Dal.SupportBatch && list2.Count() > 1)
|
if (session2.Dal.SupportBatch && list2.Count > 1)
|
||||||
{
|
{
|
||||||
//DefaultSpan.Current?.AppendTag("SupportBatch");
|
//DefaultSpan.Current?.AppendTag("SupportBatch");
|
||||||
|
|
||||||
|
@ -392,6 +391,9 @@ public static class EntityExtension
|
||||||
count = DoAction(list2, func, count);
|
count = DoAction(list2, func, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 统一清空缓存,避免因事务回滚等原因导致缓存数据不一致
|
||||||
|
session?.ClearCache(func + "", true);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,6 +526,8 @@ public static class EntityExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.ClearCache(nameof(BatchInsert), true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -614,6 +618,8 @@ public static class EntityExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.ClearCache(nameof(BatchInsertIgnore), true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -704,6 +710,8 @@ public static class EntityExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.ClearCache(nameof(BatchReplace), true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -797,6 +805,8 @@ public static class EntityExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.ClearCache(nameof(BatchUpdate), true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -941,6 +951,8 @@ public static class EntityExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.ClearCache(nameof(BatchUpsert), true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -1018,7 +1030,11 @@ public static class EntityExtension
|
||||||
{
|
{
|
||||||
if (span != null) span.Tag = $"{session.TableName}[{entity}]";
|
if (span != null) span.Tag = $"{session.TableName}[{entity}]";
|
||||||
|
|
||||||
return dal.Session.Upsert(session.DataTable, option.Columns, option.UpdateColumns, option.AddColumns, [entity as IModel]);
|
var rs = dal.Session.Upsert(session.DataTable, option.Columns, option.UpdateColumns, option.AddColumns, [entity]);
|
||||||
|
|
||||||
|
session.ClearCache(nameof(Upsert), true);
|
||||||
|
|
||||||
|
return rs;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -530,7 +530,7 @@ public class EntitySession<TEntity> : DisposeBase, IEntitySession where TEntity
|
||||||
|
|
||||||
// Count提供的是非精确数据,避免频繁更新
|
// Count提供的是非精确数据,避免频繁更新
|
||||||
//_Count = -1L;
|
//_Count = -1L;
|
||||||
//_NextCount = DateTime.MinValue;
|
_NextCount = DateTime.MinValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String CacheKey => $"{ConnName}_{TableName}_{ThisType.Name}";
|
String CacheKey => $"{ConnName}_{TableName}_{ThisType.Name}";
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
using System;
|
using System.Data;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
|
||||||
using NewLife.Data;
|
using NewLife.Data;
|
||||||
using XCode.Configuration;
|
using XCode.Configuration;
|
||||||
using XCode.Shards;
|
using XCode.Shards;
|
||||||
|
@ -9,14 +7,13 @@ using XCode.Statistics;
|
||||||
namespace XCode;
|
namespace XCode;
|
||||||
|
|
||||||
/// <summary>指定实体工厂</summary>
|
/// <summary>指定实体工厂</summary>
|
||||||
public class EntityFactoryAttribute : Attribute
|
/// <remarks>指定实体工厂</remarks>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public class EntityFactoryAttribute(Type type) : Attribute
|
||||||
{
|
{
|
||||||
/// <summary>实体工厂类型</summary>
|
/// <summary>实体工厂类型</summary>
|
||||||
public Type Type { get; set; }
|
public Type Type { get; set; } = type;
|
||||||
|
|
||||||
/// <summary>指定实体工厂</summary>
|
|
||||||
/// <param name="type"></param>
|
|
||||||
public EntityFactoryAttribute(Type type) => Type = type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>数据实体操作接口</summary>
|
/// <summary>数据实体操作接口</summary>
|
||||||
|
|
Loading…
Reference in New Issue