From 5dd8210653731fa0429f59591a9d2ddc13036cde Mon Sep 17 00:00:00 2001 From: AlexLEWIS Date: Fri, 6 Aug 2021 16:55:44 +0800 Subject: [PATCH] Code cleanup. --- .../BaseEntity.cs | 95 +++++++++------- .../BaseEntityAsync.cs | 103 ++++++++++-------- .../BaseEntityReadOnly.cs | 84 ++++++++------ .../FreeSql.Extensions.BaseEntity.csproj | 5 +- 4 files changed, 164 insertions(+), 123 deletions(-) diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs index 40382f84..76d2d2a5 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs @@ -1,12 +1,15 @@ -using FreeSql; +#if NET40 +using FreeSql.DataAnnotations; +using System; + +#else using FreeSql.DataAnnotations; using System; -using System.Data; -using System.Diagnostics; -using System.Linq.Expressions; -using System.Threading; using System.Threading.Tasks; +#endif + +// ReSharper disable once CheckNamespace namespace FreeSql { /// @@ -21,9 +24,9 @@ namespace FreeSql { static BaseEntity() { - var tkeyType = typeof(TKey)?.NullableTypeOrThis(); - if (tkeyType == typeof(int) || tkeyType == typeof(long)) - BaseEntity.ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true)); + var keyType = typeof(TKey).NullableTypeOrThis(); + if (keyType == typeof(int) || keyType == typeof(long)) + ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true)); } /// @@ -32,14 +35,13 @@ namespace FreeSql [Column(Position = 1)] public virtual TKey Id { get; set; } -#if net40 -#else +#if !NET40 /// /// 根据主键值获取数据 /// /// /// - async public static Task FindAsync(TKey id) + public static async Task FindAsync(TKey id) { var item = await Select.WhereDynamic(id).FirstAsync(); (item as BaseEntity)?.Attach(); @@ -69,15 +71,18 @@ namespace FreeSql { bool UpdateIsDeleted(bool value) { - if (this.Repository == null) + if (Repository is null) + { return Orm.Update(this as TEntity) - .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) - .Set(a => (a as BaseEntity).IsDeleted, this.IsDeleted = value).ExecuteAffrows() == 1; + .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) + .Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrows() == 1; + } - this.IsDeleted = value; - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.Update(this as TEntity) == 1; + IsDeleted = value; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.Update(this as TEntity) == 1; } + /// /// 删除数据 /// @@ -85,18 +90,21 @@ namespace FreeSql /// public virtual bool Delete(bool physicalDelete = false) { - if (physicalDelete == false) return this.UpdateIsDeleted(true); - if (this.Repository == null) + if (physicalDelete == false) + return UpdateIsDeleted(true); + + if (Repository is null) return Orm.Delete(this as TEntity).ExecuteAffrows() == 1; - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.Delete(this as TEntity) == 1; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.Delete(this as TEntity) == 1; } + /// /// 恢复删除的数据 /// /// - public virtual bool Restore() => this.UpdateIsDeleted(false); + public virtual bool Restore() => UpdateIsDeleted(false); /// /// 更新数据 @@ -104,26 +112,29 @@ namespace FreeSql /// public virtual bool Update() { - this.UpdateTime = DateTime.Now; - if (this.Repository == null) + UpdateTime = DateTime.Now; + if (Repository is null) + { return Orm.Update() - .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) - .SetSource(this as TEntity).ExecuteAffrows() == 1; + .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) + .SetSource(this as TEntity).ExecuteAffrows() == 1; + } - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.Update(this as TEntity) == 1; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.Update(this as TEntity) == 1; } + /// /// 插入数据 /// public virtual TEntity Insert() { - this.CreateTime = DateTime.Now; - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + CreateTime = DateTime.Now; + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.Insert(this as TEntity); + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.Insert(this as TEntity); } /// @@ -132,12 +143,12 @@ namespace FreeSql /// public virtual TEntity Save() { - this.UpdateTime = DateTime.Now; - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + UpdateTime = DateTime.Now; + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.InsertOrUpdate(this as TEntity); + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.InsertOrUpdate(this as TEntity); } /// @@ -146,11 +157,11 @@ namespace FreeSql /// 导航属性名 public virtual void SaveMany(string navigatePropertyName) { - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - this.Repository.SaveMany(this as TEntity, navigatePropertyName); + Repository.UnitOfWork = _resolveUow?.Invoke(); + Repository.SaveMany(this as TEntity, navigatePropertyName); } } } \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs index ca589470..3821a812 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs @@ -1,9 +1,14 @@ - -using FreeSql; +#if NET40 +using FreeSql.DataAnnotations; + +#else using FreeSql.DataAnnotations; using System; using System.Threading.Tasks; +#endif + +// ReSharper disable once CheckNamespace namespace FreeSql { /// @@ -18,32 +23,30 @@ namespace FreeSql { static BaseEntityAsync() { - var tkeyType = typeof(TKey)?.NullableTypeOrThis(); - if (tkeyType == typeof(int) || tkeyType == typeof(long)) - BaseEntity.ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true)); + var keyType = typeof(TKey).NullableTypeOrThis(); + if (keyType == typeof(int) || keyType == typeof(long)) + ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true)); } /// /// 主键 /// - [Column(Position = 1)] + [Column(Position = 1)] public virtual TKey Id { get; set; } -#if net40 -#else +#if !NET40 /// /// 根据主键值获取数据 /// /// /// - async public static Task FindAsync(TKey id) + public static async Task FindAsync(TKey id) { var item = await Select.WhereDynamic(id).FirstAsync(); (item as BaseEntity)?.Attach(); return item; } #endif - } /// @@ -53,65 +56,73 @@ namespace FreeSql [Table(DisableSyncStructure = true)] public abstract class BaseEntityAsync : BaseEntityReadOnly where TEntity : class { -#if net40 -#else +#if !NET40 async Task UpdateIsDeletedAsync(bool value) { - if (this.Repository == null) + if (Repository is null) + { return await Orm.Update(this as TEntity) - .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) - .Set(a => (a as BaseEntity).IsDeleted, this.IsDeleted = value).ExecuteAffrowsAsync() == 1; + .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) + .Set(a => (a as BaseEntity).IsDeleted, IsDeleted = value).ExecuteAffrowsAsync() == 1; + } - this.IsDeleted = value; - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return await this.Repository.UpdateAsync(this as TEntity) == 1; + IsDeleted = value; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return await Repository.UpdateAsync(this as TEntity) == 1; } + /// /// 删除数据 /// /// 是否物理删除 /// - async public virtual Task DeleteAsync(bool physicalDelete = false) + public virtual async Task DeleteAsync(bool physicalDelete = false) { - if (physicalDelete == false) return await this.UpdateIsDeletedAsync(true); - if (this.Repository == null) + if (physicalDelete == false) + return await UpdateIsDeletedAsync(true); + + if (Repository is null) return await Orm.Delete(this as TEntity).ExecuteAffrowsAsync() == 1; - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return await this.Repository.DeleteAsync(this as TEntity) == 1; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return await Repository.DeleteAsync(this as TEntity) == 1; } + /// /// 恢复删除的数据 /// /// - public virtual Task RestoreAsync() => this.UpdateIsDeletedAsync(false); + public virtual Task RestoreAsync() => UpdateIsDeletedAsync(false); /// /// 更新数据 /// /// - async public virtual Task UpdateAsync() + public virtual async Task UpdateAsync() { - this.UpdateTime = DateTime.Now; - if (this.Repository == null) + UpdateTime = DateTime.Now; + if (Repository is null) + { return await Orm.Update() - .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) - .SetSource(this as TEntity).ExecuteAffrowsAsync() == 1; + .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction()) + .SetSource(this as TEntity).ExecuteAffrowsAsync() == 1; + } - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return await this.Repository.UpdateAsync(this as TEntity) == 1; + Repository.UnitOfWork = _resolveUow?.Invoke(); + return await Repository.UpdateAsync(this as TEntity) == 1; } + /// /// 插入数据 /// public virtual Task InsertAsync() { - this.CreateTime = DateTime.Now; - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + CreateTime = DateTime.Now; + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.InsertAsync(this as TEntity); + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.InsertAsync(this as TEntity); } /// @@ -120,12 +131,12 @@ namespace FreeSql /// public virtual Task SaveAsync() { - this.UpdateTime = DateTime.Now; - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + UpdateTime = DateTime.Now; + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.InsertOrUpdateAsync(this as TEntity); + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.InsertOrUpdateAsync(this as TEntity); } /// @@ -134,12 +145,12 @@ namespace FreeSql /// 导航属性名 public virtual Task SaveManyAsync(string navigatePropertyName) { - if (this.Repository == null) - this.Repository = Orm.GetRepository(); + if (Repository is null) + Repository = Orm.GetRepository(); - this.Repository.UnitOfWork = _resolveUow?.Invoke(); - return this.Repository.SaveManyAsync(this as TEntity, navigatePropertyName); + Repository.UnitOfWork = _resolveUow?.Invoke(); + return Repository.SaveManyAsync(this as TEntity, navigatePropertyName); } #endif } -} +} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index b3dd1c8a..13c44e92 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -1,15 +1,14 @@ - -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Data.Common; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Threading; +// ReSharper disable once CheckNamespace namespace FreeSql { /// @@ -19,6 +18,7 @@ namespace FreeSql public abstract class BaseEntity { internal static IFreeSql _ormPriv; + /// /// 全局 IFreeSql orm 对象 /// @@ -26,6 +26,7 @@ namespace FreeSql .UseAutoSyncStructure(true) .UseConnectionString(DataType.Sqlite, ""data source=test.db;max pool size=5"") .Build());"); + internal static Func _resolveUow; /// @@ -52,21 +53,24 @@ namespace FreeSql _ormPriv.CodeFirst.ConfigEntity(cei.EntityType, cei.Fluent); } } + _resolveUow = resolveUow; } - + class ConfigEntityInfo { public Type EntityType; public Action Fluent; } - static ConcurrentQueue _configEntityQueues = new ConcurrentQueue(); - static object _configEntityLock = new object(); + + static ConcurrentQueue _configEntityQueues = new(); + static object _configEntityLock = new(); + internal static void ConfigEntity(Type entityType, Action fluent) { lock (_configEntityLock) { - if (_ormPriv == null) + if (_ormPriv is null) _configEntityQueues.Enqueue(new ConfigEntityInfo { EntityType = entityType, Fluent = fluent }); else _ormPriv.CodeFirst.ConfigEntity(entityType, fluent); @@ -78,16 +82,19 @@ namespace FreeSql /// [Column(Position = -4)] public virtual DateTime CreateTime { get; set; } = DateTime.Now; + /// /// 更新时间 /// [Column(Position = -3)] public virtual DateTime UpdateTime { get; set; } + /// /// 逻辑删除 /// [Column(Position = -2)] public virtual bool IsDeleted { get; set; } + /// /// 排序 /// @@ -107,25 +114,29 @@ namespace FreeSql get { var select = Orm.Select() - .TrackToList(TrackToList) //自动为每个元素 Attach - .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction(false)); + .TrackToList(TrackToList) //自动为每个元素 Attach + .WithTransaction(_resolveUow?.Invoke()?.GetOrBeginTransaction(false)); return select.WhereCascade(a => (a as BaseEntity).IsDeleted == false); } } static void TrackToList(object list) { - if (list == null) return; - var ls = list as IList; - if (ls == null) + if (list is null) + return; + + if (list is not IList ls) { - var ie = list as IEnumerable; - if (ie == null) return; + if (list is not IEnumerable ie) + return; + var isFirst = true; + IBaseRepository berepo = null; + foreach (var item in ie) { - if (item == null) return; + if (item is null) return; if (isFirst) { isFirst = false; @@ -135,28 +146,36 @@ namespace FreeSql if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; if (item is BaseEntity == false) return; } - var beitem = item as BaseEntity; - if (beitem != null) + + if (item is BaseEntity entity) { - if (berepo == null) berepo = Orm.GetRepository(); - beitem.Repository = berepo; - beitem.Attach(); + berepo ??= Orm.GetRepository(); + entity.Repository = berepo; + entity.Attach(); } } + return; } - if (ls.Any() == false) return; - if (ls.FirstOrDefault() is BaseEntity == false) return; - if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) return; + + if (ls.Any() == false) + return; + + if (ls.FirstOrDefault() is not BaseEntity) + return; + + if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) + return; + IBaseRepository repo = null; + foreach (var item in ls) { - var beitem = item as BaseEntity; - if (beitem != null) + if (item is BaseEntity entity) { - if (repo == null) repo = Orm.GetRepository(); - beitem.Repository = repo; - beitem.Attach(); + repo ??= Orm.GetRepository(); + entity.Repository = repo; + entity.Attach(); } } } @@ -167,6 +186,7 @@ namespace FreeSql /// lambda表达式 /// public static ISelect Where(Expression> exp) => Select.Where(exp); + /// /// 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") /// @@ -185,12 +205,10 @@ namespace FreeSql /// public TEntity Attach() { - if (this.Repository == null) - this.Repository = Orm.GetRepository(); - + Repository ??= Orm.GetRepository(); var item = this as TEntity; - this.Repository.Attach(item); + Repository.Attach(item); return item; } } -} +} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index bfd13274..8a9e2002 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -6,8 +6,8 @@ true FreeSql;ncc;YeXiangQin BaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用. - https://github.com/2881099/FreeSql/tree/master/Extensions/FreeSql.Extensions.BaseEntity - https://github.com/2881099/FreeSql/tree/master/Extensions/FreeSql.Extensions.BaseEntity + https://github.com/dotnetcore/FreeSql/tree/master/Extensions/FreeSql.Extensions.BaseEntity + https://github.com/dotnetcore/FreeSql/tree/master/Extensions/FreeSql.Extensions.BaseEntity git MIT FreeSql;ORM;BaseEntity @@ -19,6 +19,7 @@ true key.snk false + latest