diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs index 7ef0b544d..a3fa6cbf5 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs @@ -1,4 +1,6 @@ -using FreeSql; +#if netcore + +using FreeSql; using FreeSql.DataAnnotations; using System; using System.Data; @@ -142,4 +144,6 @@ public virtual TEntity Save() return this.Repository.InsertOrUpdate(this as TEntity); } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs index 13a3c29ef..e9b334587 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs @@ -1,4 +1,6 @@ -using FreeSql; +#if netcore + +using FreeSql; using FreeSql.DataAnnotations; using System; using System.Threading.Tasks; @@ -124,4 +126,6 @@ public virtual Task SaveAsync() return this.Repository.InsertOrUpdateAsync(this as TEntity); } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index 4b4914336..4d0e2ee02 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -1,4 +1,6 @@ -using FreeSql.DataAnnotations; +#if netcore + +using FreeSql.DataAnnotations; using System; using System.Collections; using System.Collections.Generic; @@ -199,4 +201,6 @@ public TEntity Attach() return item; } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityTree.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityTree.cs index e805aa6b3..abb281090 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityTree.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityTree.cs @@ -1,4 +1,6 @@ -using FreeSql; +#if netcore + +using FreeSql; using FreeSql.DataAnnotations; using System; using System.Collections.Generic; @@ -161,4 +163,6 @@ async public override Task SaveAsync() return ret; } } -} \ No newline at end of file +} + +#endif \ 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 f245cee80..2f9cbbe7a 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -1,8 +1,8 @@  - netstandard2.0 - 1.0.0 + netcoreapp31;netcoreapp21;net4.0; + 1.0.1 true YeXiangQin BaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用. @@ -31,4 +31,12 @@ + + + + + + netcore + + diff --git a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs new file mode 100644 index 000000000..03bfa3a9b --- /dev/null +++ b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs @@ -0,0 +1,110 @@ +#if netcore +#else + +using FreeSql; +using FreeSql.DataAnnotations; +using System; +using System.Data; +using System.Diagnostics; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; + +namespace FreeSql +{ + /// + /// 包括 CreateTime/UpdateTime/IsDeleted、CRUD 方法、以及 ID 主键定义 的实体基类 + /// + /// 当 TKey 为 int/long 时,Id 主键被设为自增值主键 + /// + /// + /// + [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)); + } + + /// + /// 主键 + /// + [Column(Position = 1)] + public virtual TKey Id { get; set; } + + /// + /// 根据主键值获取数据 + /// + /// + /// + public static TEntity Find(TKey id) + { + var item = Select.WhereDynamic(id).First(); + (item as BaseEntity)?.Attach(); + return item; + } + } + + /// + /// 包括 CreateTime/UpdateTime/IsDeleted、以及 CRUD 异步和同步方法的实体基类 + /// + /// + [Table(DisableSyncStructure = true)] + public abstract class BaseEntity : BaseEntityReadOnly where TEntity : class + { + bool DeletedPrivate(bool value) + { + if (this.Repository == null) + return Orm.Delete(this as TEntity) + .ExecuteAffrows() == 1; + + return this.Repository.Delete(this as TEntity) == 1; + } + /// + /// 删除数据 + /// + /// + public virtual bool Delete() => this.DeletedPrivate(true); + + /// + /// 更新数据 + /// + /// + public virtual bool Update() + { + 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() + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + return this.Repository.Insert(this as TEntity); + } + + /// + /// 更新或插入 + /// + /// + public virtual TEntity Save() + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + return this.Repository.InsertOrUpdate(this as TEntity); + } + } +} + +#endif \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs new file mode 100644 index 000000000..33ff1a2f0 --- /dev/null +++ b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs @@ -0,0 +1,130 @@ +#if netcore +#else + +using FreeSql.DataAnnotations; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; +using System.Threading; + +namespace FreeSql +{ + /// + /// 包括 CreateTime/UpdateTime/IsDeleted 的实体基类 + /// + [Table(DisableSyncStructure = true)] + public abstract class BaseEntity + { + static IFreeSql _ormPriv; + /// + /// 全局 IFreeSql orm 对象 + /// + public static IFreeSql Orm => _ormPriv ?? throw new Exception(@"使用前请初始化 BaseEntity.Initialization(new FreeSqlBuilder() +.UseAutoSyncStructure(true) +.UseConnectionString(DataType.Sqlite, ""data source=test.db;max pool size=5"") +.Build());"); + + /// + /// 初始化BaseEntity + /// BaseEntity.Initialization(new FreeSqlBuilder() + /// + /// .UseAutoSyncStructure(true) + /// + /// .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") + /// + /// .Build()); + /// + /// IFreeSql orm 对象 + public static void Initialization(IFreeSql fsql) + { + _ormPriv = fsql; + _ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine(e.Sql + "\r\n"); + } + } + + public abstract class BaseEntityReadOnly : BaseEntity where TEntity : class + { + /// + /// 查询数据 + /// + /// + public static ISelect Select + { + get + { + var select = Orm.Select().TrackToList(TrackToList); //自动为每个元素 Attach; + return select; + } + } + + static void TrackToList(object list) + { + if (list == null) return; + var ls = list as IList; + if (ls == null) + { + var ie = list as IEnumerable; + if (ie == null) return; + var isFirst = true; + foreach (var item in ie) + { + if (item == null) return; + if (isFirst) + { + isFirst = false; + var itemType = item.GetType(); + if (itemType == typeof(object)) return; + if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; + if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; + if (item is BaseEntity == false) return; + } + (item as BaseEntity)?.Attach(); + } + return; + } + if (ls.Any() == false) return; + if (ls.FirstOrDefault() is BaseEntity == false) return; + if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) return; + foreach (var item in ls) + (item as BaseEntity)?.Attach(); + } + + /// + /// 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") + /// + /// 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") + /// + /// true 时生效 + /// lambda表达式 + /// + public static ISelect WhereIf(bool condition, Expression> exp) => Select.WhereIf(condition, exp); + + /// + /// 仓储对象 + /// + protected IBaseRepository Repository { get; set; } + + /// + /// 附加实体,在更新数据时,只更新变化的部分 + /// + public TEntity Attach() + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + var item = this as TEntity; + this.Repository.Attach(item); + return item; + } + } +} + +#endif \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.EfCoreFluentApi/FreeSql.Extensions.EfCoreFluentApi.csproj b/Extensions/FreeSql.Extensions.EfCoreFluentApi/FreeSql.Extensions.EfCoreFluentApi.csproj index 671086f81..8da4680fb 100644 --- a/Extensions/FreeSql.Extensions.EfCoreFluentApi/FreeSql.Extensions.EfCoreFluentApi.csproj +++ b/Extensions/FreeSql.Extensions.EfCoreFluentApi/FreeSql.Extensions.EfCoreFluentApi.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 扩展包实现,使用 FluentApi 方式配置实体模型,使用习惯接近 EFCore,方便过渡. diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 9d322a962..68cb75295 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 扩展包,可实现实体类属性为对象时,以JSON形式映射存储. diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 99caf79aa..79b3dc133 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 扩展包,可实现【延时加载】属性. diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 4235f29d6..a1747bac3 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -12,7 +12,7 @@ 使用 FreeSql 快速生成数据库的实体类,安装:dotnet tool install -g FreeSql.Generator https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql - 1.0.0 + 1.0.1 FreeSql DbFirst 实体生成器 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index bbed01ca2..c5c5dcf2f 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And Access diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index d9f91124e..dc0203b8a 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -110,13 +110,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 41577a7e8..6a050d43b 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/Access, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 98df7eab4..5aa54a7b4 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And Access diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 222eeaf22..98f412f3b 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库 Ms Access 实现 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 79a2a23e9..e4cf46b69 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net452;net451;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 65d492bd2..c66383bed 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index dc0a16699..e459357bd 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库 Odbc 实现,基于 {Oracle}、{SQL Server}、{MySQL ODBC 8.0 Unicode Driver}、{PostgreSQL Unicode(x64)}、{DM8 ODBC Driver} 专用访问实现,以及通用 Odbc 访问所有数据库 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 86906bfcd..6b0096a1a 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 Oracle 11 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 787a7ac6e..351d72b12 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -2,7 +2,7 @@ netstandard2.0;net461;net452;net451;net45 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 PostgreSQL 9.5 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 9b41cd598..c7d6e4fc2 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -2,7 +2,7 @@ netstandard2.0;net451;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 456cba143..31568f3de 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 1.0.0 + 1.0.1 true YeXiangQin FreeSql 数据库实现,基于 Sqlite 3.0,支持 .NetCore、.NetFramework、Xamarin diff --git a/readme.md b/readme.md index c431f5dd5..564b2192c 100644 --- a/readme.md +++ b/readme.md @@ -40,7 +40,7 @@ FreeSql 是功能强大的对象关系映射技术(O/RM),支持 .NETCore 2.1+ - 要么[FreeSql.Connection.Extensions](https://github.com/2881099/FreeSql.Connection.Extensions),有点像Dapper的使用习惯; - 要么[FreeSql.BaseEntity](https://github.com/2881099/FreeSql/tree/master/Examples/base_entity),我求简单现在使用的这个; -> 即将推出 [FluentApi 实体模型与 EfCore 90% 相似的扩展包](https://github.com/2881099/FreeSql/tree/master/Extensions/FreeSql.Extensions.EfCoreFluentApi); +> [FluentApi 与 EfCore 90% 相似的扩展包](https://github.com/2881099/FreeSql/tree/master/Extensions/FreeSql.Extensions.EfCoreFluentApi); > 学习项目