From 330eb4028585e9d4e55d1e1424ee0b1e7fa69f7b Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 16 Nov 2019 04:13:07 +0800 Subject: [PATCH] ## v0.11.18 --- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- FreeSql.DbContext/DbContext/DbContext.cs | 68 +++++++-- FreeSql.DbContext/DbSet/DbSet.cs | 9 ++ FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 7 + FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 131 ------------------ .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- 17 files changed, 86 insertions(+), 155 deletions(-) diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 4f291843..d45b911c 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.11.15 + 0.11.18 true YeXiangQin BaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用. diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 6cd441c3..d29b40e0 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 - 0.11.15 + 0.11.18 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 d698b807..4a5645aa 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 - 0.11.15 + 0.11.18 true YeXiangQin FreeSql 扩展包,可实现【延时加载】属性. diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index 539f5183..7db324cf 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -92,6 +92,7 @@ namespace FreeSql protected List _listSet = new List(); protected Dictionary _dicSet = new Dictionary(); + internal Dictionary InternalDicSet => _dicSet; public DbSet Set() where TEntity : class => this.Set(typeof(TEntity)) as DbSet; public virtual IDbSet Set(Type entityType) { @@ -105,12 +106,21 @@ namespace FreeSql #endregion #region DbSet 快速代理 + void CheckEntityTypeOrThrow(Type entityType) + { + if (Orm.CodeFirst.GetTableByEntity(entityType) == null) + throw new ArgumentException($"参数 data 类型错误 {entityType.FullName} "); + } /// /// 添加 /// /// /// - public void Add(TEntity data) where TEntity : class => this.Set().Add(data); + public void Add(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().Add(data); + } public void AddRange(IEnumerable data) where TEntity : class => this.Set().AddRange(data); /// @@ -118,7 +128,11 @@ namespace FreeSql /// /// /// - public void Update(TEntity data) where TEntity : class => this.Set().Update(data); + public void Update(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().Update(data); + } public void UpdateRange(IEnumerable data) where TEntity : class => this.Set().UpdateRange(data); /// @@ -126,7 +140,11 @@ namespace FreeSql /// /// /// - public void Remove(TEntity data) where TEntity : class => this.Set().Remove(data); + public void Remove(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().Remove(data); + } public void RemoveRange(IEnumerable data) where TEntity : class => this.Set().RemoveRange(data); /// @@ -134,21 +152,32 @@ namespace FreeSql /// /// /// - public void AddOrUpdate(TEntity data) where TEntity : class => this.Set().AddOrUpdate(data); - + public void AddOrUpdate(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().AddOrUpdate(data); + } /// /// 保存实体的指定 ManyToMany 导航属性 /// /// 实体对象 /// 属性名 - public void SaveManyToMany(TEntity data, string propertyName) where TEntity : class => this.Set().SaveManyToMany(data, propertyName); + public void SaveManyToMany(TEntity data, string propertyName) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().SaveManyToMany(data, propertyName); + } /// /// 附加实体,可用于不查询就更新或删除 /// /// /// - public void Attach(TEntity data) where TEntity : class => this.Set().Attach(data); + public void Attach(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + this.Set().Attach(data); + } public void AttachRange(IEnumerable data) where TEntity : class => this.Set().AttachRange(data); /// @@ -158,19 +187,36 @@ namespace FreeSql /// public DbContext AttachOnlyPrimary(TEntity data) where TEntity : class { + CheckEntityTypeOrThrow(typeof(TEntity)); this.Set().AttachOnlyPrimary(data); return this; } #if net40 #else - public Task AddAsync(TEntity data) where TEntity : class => this.Set().AddAsync(data); + public Task AddAsync(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + return this.Set().AddAsync(data); + } public Task AddRangeAsync(IEnumerable data) where TEntity : class => this.Set().AddRangeAsync(data); - public Task UpdateAsync(TEntity data) where TEntity : class => this.Set().UpdateAsync(data); + public Task UpdateAsync(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + return this.Set().UpdateAsync(data); + } public Task UpdateRangeAsync(IEnumerable data) where TEntity : class => this.Set().UpdateRangeAsync(data); - public Task AddOrUpdateAsync(TEntity data) where TEntity : class => this.Set().AddOrUpdateAsync(data); - public Task SaveManyToManyAsync(TEntity data, string propertyName) where TEntity : class => this.Set().SaveManyToManyAsync(data, propertyName); + public Task AddOrUpdateAsync(TEntity data) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + return this.Set().AddOrUpdateAsync(data); + } + public Task SaveManyToManyAsync(TEntity data, string propertyName) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + return this.Set().SaveManyToManyAsync(data, propertyName); + } #endif #endregion diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index fc31b1a8..e0728bef 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -133,8 +133,17 @@ namespace FreeSql { if (_dicDbSetObjects.TryGetValue(et, out var tryds)) return tryds; _dicDbSetObjects.Add(et, tryds = _db.Set().AsType(et)); + if (_db.InternalDicSet.TryGetValue(et, out var tryds2)) + { + var copyTo = typeof(DbSet<>).MakeGenericType(et).GetMethod("StatesCopyToDbSetObject", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(DbSet) }, null); + copyTo?.Invoke(tryds2, new object[] { tryds }); + } return tryds; } + void StatesCopyToDbSetObject(DbSet ds) + { + ds.AttachRange(_states.Values.OrderBy(a => a.Time).Select(a => a.Value).ToArray()); + } public class EntityState { diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 21d73394..58aecfbe 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 0.11.15 + 0.11.18 true YeXiangQin FreeSql is the most convenient ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, And Odbc. diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9c0597d5..1a43f59e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -106,6 +106,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 3fad19f2..858e358e 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 0.11.15 + 0.11.18 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, 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 dda9a6ec..28038e50 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45;net40 - 0.11.15 + 0.11.18 true YeXiangQin FreeSql is the most convenient ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, And Odbc. diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 185896b3..e436e1d8 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1996,137 +1996,6 @@ - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - - - - - - - 查询 - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) - - - - - - 可自定义解析表达式 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 5b0a0140..3c4a8c90 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 - 0.11.15 + 0.11.18 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 0453986f..da040f8c 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 - 0.11.15 + 0.11.18 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 d7c8f0af..f20e42f9 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 - 0.11.15 + 0.11.18 true YeXiangQin FreeSql 数据库 Odbc 实现,基于 {Oracle}、{SQL Server}、{MySQL ODBC 8.0 Unicode Driver}、{PostgreSQL Unicode(x64)} 专用访问实现,以及通用 Odbc 访问所有数据库 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 6f219ea5..99dcb2cc 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 - 0.11.15 + 0.11.18 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 fa974946..9dc1a9e8 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 - 0.11.15 + 0.11.18 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 b91d7974..5e10e7d9 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 - 0.11.15 + 0.11.18 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 2c9482d6..5eb15ef6 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 - 0.11.15 + 0.11.18 true YeXiangQin FreeSql 数据库实现,基于 Sqlite 3.0,支持 .NetCore、.NetFramework、Xamarin