using FreeSql; using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Data; using System.Diagnostics; using System.Linq.Expressions; using System.Threading.Tasks; [Table(DisableSyncStructure = true)] public abstract class BaseEntity { private static Lazy _ormLazy = new Lazy(() => { var orm = new FreeSqlBuilder() .UseAutoSyncStructure(true) .UseNoneCommandParameter(true) .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max 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") //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;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") .Build(); orm.Aop.CurdBefore += (s, e) => Trace.WriteLine(e.Sql + "\r\n"); return orm; }); public static IFreeSql Orm => _ormLazy.Value; /// /// 创建时间 /// public DateTime CreateTime { get; set; } /// /// 更新时间 /// public DateTime UpdateTime { get; set; } /// /// 逻辑删除 /// public bool IsDeleted { get; set; } /// /// 开启工作单元事务 /// /// /// public static IUnitOfWork Begin() => Begin(null); public static IUnitOfWork Begin(IsolationLevel? level) { var uow = Orm.CreateUnitOfWork(); uow.IsolationLevel = level; UnitOfWork.Current.Value = uow; return uow; } } [Table(DisableSyncStructure = true)] public abstract class BaseEntity : BaseEntity where TEntity : class { public static ISelect Select => Orm.Select() .WithTransaction(UnitOfWork.Current.Value?.GetOrBeginTransaction(false)) .WhereCascade(a => (a as BaseEntity).IsDeleted == false); public static ISelect Where(Expression> exp) => Select.Where(exp); public static ISelect WhereIf(bool condition, Expression> exp) => Select.WhereIf(condition, exp); [JsonIgnore] protected IBaseRepository Repository { get; set; } async Task UpdateIsDeleted(bool value) { if (this.Repository == null) return await Orm.Update(this as TEntity) .WithTransaction(UnitOfWork.Current.Value?.GetOrBeginTransaction()) .Set(a => (a as BaseEntity).IsDeleted, this.IsDeleted = value).ExecuteAffrowsAsync() == 1; this.IsDeleted = value; this.Repository.UnitOfWork = UnitOfWork.Current.Value; return await this.Repository.UpdateAsync(this as TEntity) == 1; } /// /// 删除数据 /// /// public virtual Task Delete() => this.UpdateIsDeleted(true); /// /// 恢复删除的数据 /// /// public virtual Task Restore() => this.UpdateIsDeleted(false); /// /// 附加实体,在更新数据时,只更新变化的部分 /// public TEntity Attach() { if (this.Repository == null) this.Repository = Orm.GetRepository(); var item = this as TEntity; this.Repository.Attach(item); return item; } /// /// 更新数据 /// /// async public virtual Task Update() { this.UpdateTime = DateTime.Now; if (this.Repository == null) return await Orm.Update() .WithTransaction(UnitOfWork.Current.Value?.GetOrBeginTransaction()) .SetSource(this as TEntity).ExecuteAffrowsAsync() == 1; this.Repository.UnitOfWork = UnitOfWork.Current.Value; return await this.Repository.UpdateAsync(this as TEntity) == 1; } /// /// 插入数据 /// async public virtual Task Insert() { this.CreateTime = DateTime.Now; if (this.Repository == null) this.Repository = Orm.GetRepository(); this.Repository.UnitOfWork = UnitOfWork.Current.Value; await this.Repository.InsertAsync(this as TEntity); } /// /// 更新或插入 /// /// async public virtual Task Save() { this.UpdateTime = DateTime.Now; if (this.Repository == null) this.Repository = Orm.GetRepository(); this.Repository.UnitOfWork = UnitOfWork.Current.Value; await this.Repository.InsertOrUpdateAsync(this as TEntity); } } [Table(DisableSyncStructure = true)] public abstract class BaseEntity : BaseEntity where TEntity : class { static BaseEntity() { var tkeyType = typeof(TKey)?.NullableTypeOrThis(); if (tkeyType == typeof(int) || tkeyType == typeof(long)) Orm.CodeFirst.ConfigEntity(typeof(TEntity), t => t.Property("Id").IsIdentity(true)); } /// /// 主键 /// public virtual TKey Id { get; set; } /// /// 根据主键值获取数据 /// /// /// async public static Task Find(TKey id) { var item = await Select.WhereDynamic(id).FirstAsync(); (item as BaseEntity)?.Attach(); return item; } }