mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 优化 BaseEntity
This commit is contained in:
parent
8c72d54025
commit
ecd3b13304
@ -139,7 +139,7 @@ namespace base_entity
|
|||||||
public int TypeGuid { get; set; }
|
public int TypeGuid { get; set; }
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
public DateTime CreateTime { get; set; }
|
public DateTime CreateTime { get; set; }
|
||||||
[Column(MapType = typeof(JArray))]
|
[JsonMap]
|
||||||
public List<int> CouponIds { get; set; }
|
public List<int> CouponIds { get; set; }
|
||||||
}
|
}
|
||||||
class TopicMapTypeToListDtoMap
|
class TopicMapTypeToListDtoMap
|
||||||
@ -167,7 +167,7 @@ namespace base_entity
|
|||||||
|
|
||||||
//.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true")
|
//.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true")
|
||||||
|
|
||||||
.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
|
//.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
|
||||||
//.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
|
//.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
|
||||||
|
|
||||||
//.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
|
//.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
|
||||||
@ -193,7 +193,7 @@ namespace base_entity
|
|||||||
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
|
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
//fsql.UseJsonMap();
|
fsql.UseJsonMap();
|
||||||
|
|
||||||
fsql.Delete<TopicMapTypeToListDto>().Where("1=1").ExecuteAffrows();
|
fsql.Delete<TopicMapTypeToListDto>().Where("1=1").ExecuteAffrows();
|
||||||
fsql.Insert(new[]
|
fsql.Insert(new[]
|
||||||
|
@ -80,12 +80,10 @@ namespace FreeSql
|
|||||||
{
|
{
|
||||||
bool UpdateIsDeleted(bool value)
|
bool UpdateIsDeleted(bool value)
|
||||||
{
|
{
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
{
|
|
||||||
return Orm.Update<TEntity>(this as TEntity)
|
return Orm.Update<TEntity>(this as TEntity)
|
||||||
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
||||||
.Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrows() == 1;
|
.Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrows() == 1;
|
||||||
}
|
|
||||||
|
|
||||||
IsDeleted = value;
|
IsDeleted = value;
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
@ -103,7 +101,7 @@ namespace FreeSql
|
|||||||
if (physicalDelete == false)
|
if (physicalDelete == false)
|
||||||
return UpdateIsDeleted(true);
|
return UpdateIsDeleted(true);
|
||||||
|
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
return Orm.Delete<TEntity>(this as TEntity).ExecuteAffrows() == 1;
|
return Orm.Delete<TEntity>(this as TEntity).ExecuteAffrows() == 1;
|
||||||
|
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
@ -125,12 +123,10 @@ namespace FreeSql
|
|||||||
public virtual bool Update()
|
public virtual bool Update()
|
||||||
{
|
{
|
||||||
UpdateTime = DateTime.Now;
|
UpdateTime = DateTime.Now;
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
{
|
|
||||||
return Orm.Update<TEntity>()
|
return Orm.Update<TEntity>()
|
||||||
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
||||||
.SetSource(this as TEntity).ExecuteAffrows() == 1;
|
.SetSource(this as TEntity).ExecuteAffrows() == 1;
|
||||||
}
|
|
||||||
|
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.Update(this as TEntity) == 1;
|
return Repository.Update(this as TEntity) == 1;
|
||||||
@ -143,7 +139,8 @@ namespace FreeSql
|
|||||||
public virtual TEntity Insert()
|
public virtual TEntity Insert()
|
||||||
{
|
{
|
||||||
CreateTime = DateTime.Now;
|
CreateTime = DateTime.Now;
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.Insert(this as TEntity);
|
return Repository.Insert(this as TEntity);
|
||||||
}
|
}
|
||||||
@ -156,7 +153,8 @@ namespace FreeSql
|
|||||||
public virtual TEntity Save()
|
public virtual TEntity Save()
|
||||||
{
|
{
|
||||||
UpdateTime = DateTime.Now;
|
UpdateTime = DateTime.Now;
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.InsertOrUpdate(this as TEntity);
|
return Repository.InsertOrUpdate(this as TEntity);
|
||||||
}
|
}
|
||||||
@ -168,7 +166,8 @@ namespace FreeSql
|
|||||||
/// <param name="navigatePropertyName">Navigation property name</param>
|
/// <param name="navigatePropertyName">Navigation property name</param>
|
||||||
public virtual void SaveMany(string navigatePropertyName)
|
public virtual void SaveMany(string navigatePropertyName)
|
||||||
{
|
{
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
Repository.SaveMany(this as TEntity, navigatePropertyName);
|
Repository.SaveMany(this as TEntity, navigatePropertyName);
|
||||||
}
|
}
|
||||||
|
@ -67,12 +67,10 @@ namespace FreeSql
|
|||||||
#if !NET40
|
#if !NET40
|
||||||
async Task<bool> UpdateIsDeletedAsync(bool value)
|
async Task<bool> UpdateIsDeletedAsync(bool value)
|
||||||
{
|
{
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
{
|
|
||||||
return await Orm.Update<TEntity>(this as TEntity)
|
return await Orm.Update<TEntity>(this as TEntity)
|
||||||
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
||||||
.Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrowsAsync() == 1;
|
.Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrowsAsync() == 1;
|
||||||
}
|
|
||||||
|
|
||||||
IsDeleted = value;
|
IsDeleted = value;
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
@ -90,7 +88,7 @@ namespace FreeSql
|
|||||||
if (physicalDelete == false)
|
if (physicalDelete == false)
|
||||||
return await UpdateIsDeletedAsync(true);
|
return await UpdateIsDeletedAsync(true);
|
||||||
|
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
return await Orm.Delete<TEntity>(this as TEntity).ExecuteAffrowsAsync() == 1;
|
return await Orm.Delete<TEntity>(this as TEntity).ExecuteAffrowsAsync() == 1;
|
||||||
|
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
@ -112,12 +110,10 @@ namespace FreeSql
|
|||||||
public virtual async Task<bool> UpdateAsync()
|
public virtual async Task<bool> UpdateAsync()
|
||||||
{
|
{
|
||||||
UpdateTime = DateTime.Now;
|
UpdateTime = DateTime.Now;
|
||||||
if (Repository is null)
|
if (Repository == null)
|
||||||
{
|
|
||||||
return await Orm.Update<TEntity>()
|
return await Orm.Update<TEntity>()
|
||||||
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction())
|
||||||
.SetSource(this as TEntity).ExecuteAffrowsAsync() == 1;
|
.SetSource(this as TEntity).ExecuteAffrowsAsync() == 1;
|
||||||
}
|
|
||||||
|
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return await Repository.UpdateAsync(this as TEntity) == 1;
|
return await Repository.UpdateAsync(this as TEntity) == 1;
|
||||||
@ -130,7 +126,8 @@ namespace FreeSql
|
|||||||
public virtual Task<TEntity> InsertAsync()
|
public virtual Task<TEntity> InsertAsync()
|
||||||
{
|
{
|
||||||
CreateTime = DateTime.Now;
|
CreateTime = DateTime.Now;
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.InsertAsync(this as TEntity);
|
return Repository.InsertAsync(this as TEntity);
|
||||||
}
|
}
|
||||||
@ -143,7 +140,8 @@ namespace FreeSql
|
|||||||
public virtual Task<TEntity> SaveAsync()
|
public virtual Task<TEntity> SaveAsync()
|
||||||
{
|
{
|
||||||
UpdateTime = DateTime.Now;
|
UpdateTime = DateTime.Now;
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.InsertOrUpdateAsync(this as TEntity);
|
return Repository.InsertOrUpdateAsync(this as TEntity);
|
||||||
}
|
}
|
||||||
@ -155,7 +153,8 @@ namespace FreeSql
|
|||||||
/// <param name="navigatePropertyName">Navigation property name</param>
|
/// <param name="navigatePropertyName">Navigation property name</param>
|
||||||
public virtual Task SaveManyAsync(string navigatePropertyName)
|
public virtual Task SaveManyAsync(string navigatePropertyName)
|
||||||
{
|
{
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
Repository.UnitOfWork = _resolveUow?.Invoke();
|
Repository.UnitOfWork = _resolveUow?.Invoke();
|
||||||
return Repository.SaveManyAsync(this as TEntity, navigatePropertyName);
|
return Repository.SaveManyAsync(this as TEntity, navigatePropertyName);
|
||||||
}
|
}
|
||||||
|
@ -21,48 +21,29 @@ namespace FreeSql
|
|||||||
[Table(DisableSyncStructure = true)]
|
[Table(DisableSyncStructure = true)]
|
||||||
public abstract class BaseEntity
|
public abstract class BaseEntity
|
||||||
{
|
{
|
||||||
internal static IFreeSql _ormPriv;
|
static Func<IFreeSql> _resoleOrm;
|
||||||
|
|
||||||
private const string ErrorMessageTemplate = @"使用前请初始化:
|
|
||||||
BaseEntity.Initialization(new FreeSqlBuilder()
|
|
||||||
.UseAutoSyncStructure(true)
|
|
||||||
.UseConnectionString(DataType.Sqlite, ""data source=test.db;max pool size=5"")
|
|
||||||
.Build());";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Global IFreeSql ORM Object <br />
|
|
||||||
/// 全局 IFreeSql ORM 对象
|
|
||||||
/// </summary>
|
|
||||||
public static IFreeSql Orm => _ormPriv ?? throw new Exception(ErrorMessageTemplate);
|
|
||||||
|
|
||||||
internal static Func<IUnitOfWork> _resolveUow;
|
internal static Func<IUnitOfWork> _resolveUow;
|
||||||
|
|
||||||
/// <summary>
|
public static IFreeSql Orm => _resoleOrm?.Invoke() ?? throw new Exception("BaseEntity.Initialization 初始化错误,获取到 IFreeSql 是 null");
|
||||||
/// To initialize the BaseEntity <br />
|
|
||||||
/// 初始化 BaseEntity
|
|
||||||
/// <para></para>
|
|
||||||
/// BaseEntity.Initialization( <br />
|
|
||||||
/// new FreeSqlBuilder() <br />
|
|
||||||
/// .UseAutoSyncStructure(true) <br />
|
|
||||||
/// .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") <br />
|
|
||||||
/// .Build());
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="fsql">IFreeSql ORM Object</param>
|
|
||||||
/// <param name="resolveUow">工作单元(事务)委托,如果不使用事务请传 null<para></para>解释:由于AsyncLocal平台兼容不好,所以交给外部管理</param>
|
|
||||||
public static void Initialization(IFreeSql fsql, Func<IUnitOfWork> resolveUow)
|
public static void Initialization(IFreeSql fsql, Func<IUnitOfWork> resolveUow)
|
||||||
{
|
{
|
||||||
_ormPriv = fsql;
|
fsql.Aop.CurdBefore += (s, e) => Trace.WriteLine($"\r\n线程{Thread.CurrentThread.ManagedThreadId}: {e.Sql}\r\n");
|
||||||
_ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine($"\r\n线程{Thread.CurrentThread.ManagedThreadId}: {e.Sql}\r\n");
|
Initialization(() => fsql, resolveUow);
|
||||||
|
}
|
||||||
|
public static void Initialization(Func<IFreeSql> resoleOrm, Func<IUnitOfWork> resolveUow)
|
||||||
|
{
|
||||||
|
_resoleOrm = resoleOrm;
|
||||||
|
_resolveUow = resolveUow;
|
||||||
|
|
||||||
if (_configEntityQueues.Any())
|
if (_configEntityQueues.Any())
|
||||||
{
|
{
|
||||||
lock (_configEntityLock)
|
lock (_configEntityLock)
|
||||||
{
|
{
|
||||||
while (_configEntityQueues.TryDequeue(out var cei))
|
while (_configEntityQueues.TryDequeue(out var cei))
|
||||||
_ormPriv.CodeFirst.ConfigEntity(cei.EntityType, cei.Fluent);
|
Orm.CodeFirst.ConfigEntity(cei.EntityType, cei.Fluent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_resolveUow = resolveUow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConfigEntityInfo
|
class ConfigEntityInfo
|
||||||
@ -71,17 +52,17 @@ BaseEntity.Initialization(new FreeSqlBuilder()
|
|||||||
public Action<TableFluent> Fluent;
|
public Action<TableFluent> Fluent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static readonly ConcurrentQueue<ConfigEntityInfo> _configEntityQueues = new();
|
static readonly ConcurrentQueue<ConfigEntityInfo> _configEntityQueues = new ConcurrentQueue<ConfigEntityInfo>();
|
||||||
static readonly object _configEntityLock = new();
|
static readonly object _configEntityLock = new object();
|
||||||
|
|
||||||
internal static void ConfigEntity(Type entityType, Action<TableFluent> fluent)
|
internal static void ConfigEntity(Type entityType, Action<TableFluent> fluent)
|
||||||
{
|
{
|
||||||
lock (_configEntityLock)
|
lock (_configEntityLock)
|
||||||
{
|
{
|
||||||
if (_ormPriv is null)
|
if (_resoleOrm?.Invoke() == null)
|
||||||
_configEntityQueues.Enqueue(new ConfigEntityInfo { EntityType = entityType, Fluent = fluent });
|
_configEntityQueues.Enqueue(new ConfigEntityInfo { EntityType = entityType, Fluent = fluent });
|
||||||
else
|
else
|
||||||
_ormPriv.CodeFirst.ConfigEntity(entityType, fluent);
|
Orm.CodeFirst.ConfigEntity(entityType, fluent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,69 +114,59 @@ BaseEntity.Initialization(new FreeSqlBuilder()
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
var select = Orm.Select<TEntity>()
|
var select = Orm.Select<TEntity>()
|
||||||
.TrackToList(TrackToList) //自动为每个元素 Attach
|
.TrackToList(TrackToList) //自动为每个元素 Attach
|
||||||
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction(false));
|
.WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction(false));
|
||||||
return select.WhereCascade(a => (a as BaseEntity).IsDeleted == false);
|
return select.WhereCascade(a => (a as BaseEntity).IsDeleted == false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TrackToList(object list)
|
static void TrackToList(object list)
|
||||||
{
|
{
|
||||||
if (list is null)
|
if (list == null) return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (list is not IList<TEntity> ls)
|
var ls = list as IList<TEntity>;
|
||||||
|
if (ls == null)
|
||||||
{
|
{
|
||||||
if (list is not IEnumerable ie)
|
var ie = list as IEnumerable;
|
||||||
return;
|
if (ie == null) return;
|
||||||
|
|
||||||
var isFirst = true;
|
var isFirst = true;
|
||||||
IBaseRepository<TEntity> baseRepo = null;
|
IBaseRepository<TEntity> baseRepo = null;
|
||||||
|
|
||||||
foreach (var item in ie)
|
foreach (var item in ie)
|
||||||
{
|
{
|
||||||
if (item is null)
|
if (item == null) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFirst)
|
if (isFirst)
|
||||||
{
|
{
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
var itemType = item.GetType();
|
var itemType = item.GetType();
|
||||||
if (itemType == typeof(object)) return;
|
if (itemType == typeof(object)) return;
|
||||||
if (itemType.FullName!.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType;
|
if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType;
|
||||||
if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return;
|
if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return;
|
||||||
if (item is not BaseEntity<TEntity>) return;
|
if (item is BaseEntity<TEntity> == false) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item is BaseEntity<TEntity> entity)
|
if (item is BaseEntity<TEntity> entity)
|
||||||
{
|
{
|
||||||
baseRepo ??= Orm.GetRepository<TEntity>();
|
if (baseRepo == null) baseRepo = Orm.GetRepository<TEntity>();
|
||||||
entity.Repository = baseRepo;
|
entity.Repository = baseRepo;
|
||||||
entity.Attach();
|
entity.Attach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ls.Any() == false)
|
if (ls.Any() == false) return;
|
||||||
return;
|
if (ls.FirstOrDefault() is BaseEntity<TEntity> == false) return;
|
||||||
|
if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) return;
|
||||||
if (ls.FirstOrDefault() is not BaseEntity<TEntity>)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
IBaseRepository<TEntity> repo = null;
|
IBaseRepository<TEntity> repo = null;
|
||||||
|
|
||||||
foreach (var item in ls)
|
foreach (var item in ls)
|
||||||
{
|
{
|
||||||
if (item is BaseEntity<TEntity> entity)
|
if (item is BaseEntity<TEntity> entity)
|
||||||
{
|
{
|
||||||
repo ??= Orm.GetRepository<TEntity>();
|
if (repo == null) repo = Orm.GetRepository<TEntity>();
|
||||||
entity.Repository = repo;
|
entity.Repository = repo;
|
||||||
entity.Attach();
|
entity.Attach();
|
||||||
}
|
}
|
||||||
@ -237,7 +208,8 @@ BaseEntity.Initialization(new FreeSqlBuilder()
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public TEntity Attach()
|
public TEntity Attach()
|
||||||
{
|
{
|
||||||
Repository ??= Orm.GetRepository<TEntity>();
|
if (Repository == null)
|
||||||
|
Repository = Orm.GetRepository<TEntity>();
|
||||||
var item = this as TEntity;
|
var item = this as TEntity;
|
||||||
Repository.Attach(item);
|
Repository.Attach(item);
|
||||||
return item;
|
return item;
|
||||||
|
@ -173,26 +173,6 @@
|
|||||||
包括 CreateTime/UpdateTime/IsDeleted 的实体基类
|
包括 CreateTime/UpdateTime/IsDeleted 的实体基类
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:FreeSql.BaseEntity.Orm">
|
|
||||||
<summary>
|
|
||||||
Global IFreeSql ORM Object <br />
|
|
||||||
全局 IFreeSql ORM 对象
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:FreeSql.BaseEntity.Initialization(IFreeSql,System.Func{FreeSql.IUnitOfWork})">
|
|
||||||
<summary>
|
|
||||||
To initialize the BaseEntity <br />
|
|
||||||
初始化 BaseEntity
|
|
||||||
<para></para>
|
|
||||||
BaseEntity.Initialization( <br />
|
|
||||||
new FreeSqlBuilder() <br />
|
|
||||||
.UseAutoSyncStructure(true) <br />
|
|
||||||
.UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") <br />
|
|
||||||
.Build());
|
|
||||||
</summary>
|
|
||||||
<param name="fsql">IFreeSql ORM Object</param>
|
|
||||||
<param name="resolveUow">工作单元(事务)委托,如果不使用事务请传 null<para></para>解释:由于AsyncLocal平台兼容不好,所以交给外部管理</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:FreeSql.BaseEntity.CreateTime">
|
<member name="P:FreeSql.BaseEntity.CreateTime">
|
||||||
<summary>
|
<summary>
|
||||||
Created time <br />
|
Created time <br />
|
||||||
|
@ -95,6 +95,17 @@ var items = UserGroup.Where(a => a.Id > 10).ToList();
|
|||||||
|
|
||||||
# 事务建议
|
# 事务建议
|
||||||
|
|
||||||
|
1、同线程事务,不支持异步:
|
||||||
|
|
||||||
|
```c#
|
||||||
|
fsql.Transaction(() =>
|
||||||
|
{
|
||||||
|
//todo ...
|
||||||
|
})
|
||||||
|
```;
|
||||||
|
|
||||||
|
2、如果你是异步控
|
||||||
|
|
||||||
由于 AsyncLocal 平台兼容不好,所以交给外部管理事务。
|
由于 AsyncLocal 平台兼容不好,所以交给外部管理事务。
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
@ -103,7 +114,7 @@ static AsyncLocal<IUnitOfWork> _asyncUow = new AsyncLocal<IUnitOfWork>();
|
|||||||
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
|
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
|
||||||
```
|
```
|
||||||
|
|
||||||
在 Scoped 开始时: _asyncUow.Value = fsql.CreateUnitOfWork(); (也可以使用 UnitOfWorkManager 对象获取 uow)
|
在 Scoped 开始时:_asyncUow.Value = fsql.CreateUnitOfWork(); (也可以使用 UnitOfWorkManager 对象获取 uow)
|
||||||
|
|
||||||
在 Scoped 结束时:_asyncUow.Value = null;
|
在 Scoped 结束时:_asyncUow.Value = null;
|
||||||
|
|
||||||
|
@ -4899,3 +4899,222 @@
|
|||||||
</member>
|
</member>
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
ystem.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 and 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<param name="exp1"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="exp2"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``4(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 or 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``4(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 or 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<param name="exp1"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="exp2"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Not``4(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,System.Boolean}},System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
将 lambda 表达式取反
|
||||||
|
</summary>
|
||||||
|
<param name="exp"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.And``5(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 and 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.And``5(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 and 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<param name="exp1"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="exp2"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``5(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 or 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``5(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
使用 or 拼接两个 lambda 表达式
|
||||||
|
</summary>
|
||||||
|
<param name="exp1"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="exp2"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Not``5(System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
将 lambda 表达式取反
|
||||||
|
</summary>
|
||||||
|
<param name="exp"></param>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeUtil.NewMongodbId">
|
||||||
|
<summary>
|
||||||
|
生成类似Mongodb的ObjectId有序、不重复Guid
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Insert``1">
|
||||||
|
<summary>
|
||||||
|
插入数据
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Insert``1(``0)">
|
||||||
|
<summary>
|
||||||
|
插入数据,传入实体
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="source"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Insert``1(``0[])">
|
||||||
|
<summary>
|
||||||
|
插入数据,传入实体数组
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="source"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.List{``0})">
|
||||||
|
<summary>
|
||||||
|
插入数据,传入实体集合
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="source"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.IEnumerable{``0})">
|
||||||
|
<summary>
|
||||||
|
插入数据,传入实体集合
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="source"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.InsertOrUpdate``1">
|
||||||
|
<summary>
|
||||||
|
插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下:<para></para>
|
||||||
|
MySql 5.6+: on duplicate key update<para></para>
|
||||||
|
PostgreSQL 9.4+: on conflict do update<para></para>
|
||||||
|
SqlServer 2008+: merge into<para></para>
|
||||||
|
Oracle 11+: merge into<para></para>
|
||||||
|
Sqlite: replace into<para></para>
|
||||||
|
达梦: merge into<para></para>
|
||||||
|
人大金仓:on conflict do update<para></para>
|
||||||
|
神通:merge into<para></para>
|
||||||
|
MsAccess:不支持<para></para>
|
||||||
|
注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性)
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Update``1">
|
||||||
|
<summary>
|
||||||
|
修改数据
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Update``1(System.Object)">
|
||||||
|
<summary>
|
||||||
|
修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Select``1">
|
||||||
|
<summary>
|
||||||
|
查询数据
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Select``1(System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Delete``1">
|
||||||
|
<summary>
|
||||||
|
删除数据
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Delete``1(System.Object)">
|
||||||
|
<summary>
|
||||||
|
删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Transaction(System.Action)">
|
||||||
|
<summary>
|
||||||
|
开启事务(不支持异步)<para></para>
|
||||||
|
v1.5.0 关闭了线程事务超时自动提交的机制
|
||||||
|
</summary>
|
||||||
|
<param name="handler">事务体 () => {}</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:IFreeSql.Transaction(System.Data.IsolationLevel,System.Action)">
|
||||||
|
<summary>
|
||||||
|
开启事务(不支持异步)<para></para>
|
||||||
|
v1.5.0 关闭了线程事务超时自动提交的机制
|
||||||
|
</summary>
|
||||||
|
<param name="isolationLevel"></param>
|
||||||
|
<param name="handler">事务体 () => {}</param>
|
||||||
|
</member>
|
||||||
|
<member name="P:IFreeSql.Ado">
|
||||||
|
<summary>
|
||||||
|
数据库访问对象
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IFreeSql.Aop">
|
||||||
|
<summary>
|
||||||
|
所有拦截方法都在这里
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IFreeSql.CodeFirst">
|
||||||
|
<summary>
|
||||||
|
CodeFirst 模式开发相关方法
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IFreeSql.DbFirst">
|
||||||
|
<summary>
|
||||||
|
DbFirst 模式开发相关方法
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IFreeSql.GlobalFilter">
|
||||||
|
<summary>
|
||||||
|
全局过滤设置,可默认附加为 Select/Update/Delete 条件
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
</members>
|
||||||
|
</doc>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user