using FreeSql; using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Data; using System.Diagnostics; using System.Linq.Expressions; using System.Threading; 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; } } [Table(DisableSyncStructure = true)] public abstract class BaseEntity : BaseEntity where TEntity : class { public static ISelect Select => Orm.Select() .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; } bool UpdateIsDeleted(bool value) { if (this.Repository == null) return Orm.Update(this as TEntity) .Set(a => (a as BaseEntity).IsDeleted, this.IsDeleted = value).ExecuteAffrows() == 1; this.IsDeleted = value; return this.Repository.Update(this as TEntity) == 1; } /// /// 删除数据 /// /// public virtual bool Delete() => this.UpdateIsDeleted(true); /// /// 恢复删除的数据 /// /// public virtual bool 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; } /// /// 更新数据 /// /// public virtual bool Update() { this.UpdateTime = DateTime.Now; if (this.Repository == null) return Orm.Update() .SetSource(this as TEntity).ExecuteAffrows() == 1; return this.Repository.Update(this as TEntity) == 1; } /// /// 插入数据 /// public virtual TEntity Insert() { this.CreateTime = DateTime.Now; if (this.Repository == null) this.Repository = Orm.GetRepository(); return this.Repository.Insert(this as TEntity); } /// /// 更新或插入 /// /// public virtual TEntity Save() { this.UpdateTime = DateTime.Now; if (this.Repository == null) this.Repository = Orm.GetRepository(); return this.Repository.InsertOrUpdate(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; } /// /// 根据主键值获取数据 /// /// /// public static TEntity Find(TKey id) { var item = Select.WhereDynamic(id).First(); (item as BaseEntity)?.Attach(); return item; } }