- 优化 BaseEntity

This commit is contained in:
2881099 2022-04-22 19:12:17 +08:00
parent 8c72d54025
commit ecd3b13304
7 changed files with 293 additions and 113 deletions

View File

@ -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[]

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;

View File

@ -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 />

View File

@ -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;

View File

@ -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>