From 9767656a87d0ed627686fb8ecb9783193747476a Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Mon, 25 Jul 2022 15:19:44 +0800
Subject: [PATCH] v3.2.666-preview20220726 #1193
---
Directory.Build.props | 2 +-
.../BaseEntityReadOnly.cs | 1 +
FreeSql.DbContext/DbSet/DbSet.cs | 2 +-
FreeSql.Tests/FreeSql.Tests/Issues/1193.cs | 58 +++
FreeSql/FreeSql.xml | 402 ++++++++++--------
5 files changed, 280 insertions(+), 185 deletions(-)
create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/1193.cs
diff --git a/Directory.Build.props b/Directory.Build.props
index 900b6809..10dae847 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -9,7 +9,7 @@
- 3.2.666-preview20220725
+ 3.2.666-preview20220726
diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs
index 1eddf87f..d9ac6b96 100644
--- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs
+++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs
@@ -140,6 +140,7 @@ namespace FreeSql
if (itemType == typeof(object)) return;
if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType;
if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return;
+ if (itemType.GetConstructor(Type.EmptyTypes) == null) return;
if (item is BaseEntity == false) return;
}
diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs
index 7bd16952..f462dbd0 100644
--- a/FreeSql.DbContext/DbSet/DbSet.cs
+++ b/FreeSql.DbContext/DbSet/DbSet.cs
@@ -100,7 +100,7 @@ namespace FreeSql
if (itemType == typeof(object)) return;
if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType;
if (_db.OrmOriginal.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return;
- if (itemType.GetConstructor(System.Type.EmptyTypes) == null) return;
+ if (itemType.GetConstructor(Type.EmptyTypes) == null) return;
var dbset = _db.Set(itemType);
dbset?.GetType().GetMethod("TrackToList", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(dbset, new object[] { list });
return;
diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1193.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1193.cs
new file mode 100644
index 00000000..75bcc3ef
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Issues/1193.cs
@@ -0,0 +1,58 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Issues
+{
+ public class _1193
+ {
+ [Table(Name = "MyData_1193")]
+ public class MyDataEntity
+ {
+ [Column(IsPrimary = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string? Name { get; set; }
+ }
+
+ public class MyDataDto : MyDataDtoError
+ {
+ public MyDataDto() : base(0) { }
+ public MyDataDto(int id) : base(id) { }
+ }
+
+ public class MyDataDtoError
+ {
+ public MyDataDtoError(int id)
+ {
+ Id = id;
+ }
+
+ public MyDataDtoError(int id, string title)
+ {
+ Id = id;
+ Title = title;
+ }
+ public int Id { get; set; }
+ public string? Name { get; set; }
+ public string? Title { get; }
+ }
+
+ [Fact]
+ public void TestYear()
+ {
+ var fsql = g.sqlite;
+
+ fsql.GetRepository().Insert(new MyDataEntity { Name = "my name" + DateTime.Now.ToString("yyyyMMddTHHmmss") });
+
+ var uowm = new UnitOfWorkManager(fsql);
+
+ using var uow = uowm.Begin();
+
+ var repository = uow.Orm.GetRepository();
+
+ var firstData = repository.Select.First((o) => new MyDataDto(o.Id) { Name = o.Name });
+ var errorData = repository.Select.First((o) => new MyDataDtoError(o.Id, o.Name) { Name = o.Name });
+ }
+ }
+}
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 6cda4744..f7862590 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -3324,177 +3324,6 @@
-
-
- 测试数据库是否连接正确,本方法执行如下命令:
- MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1
- Oracle: SELECT 1 FROM dual
-
- 命令超时设置(秒)
-
- true: 成功, false: 失败
-
-
-
- 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
-
-
-
-
-
-
-
-
-
- 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 执行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 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
-
-
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
可自定义解析表达式
@@ -4518,12 +4347,6 @@
超时
-
-
- 获取资源
-
-
-
使用完毕后,归还资源
@@ -4599,12 +4422,6 @@
资源对象
-
-
- 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
-
- 资源对象
-
归还对象给对象池的时候触发
@@ -6046,3 +5863,222 @@
+ystem.Boolean}})">
+
+ 使用 and 拼接两个 lambda 表达式
+
+
+ true 时生效
+
+
+
+
+
+ 使用 or 拼接两个 lambda 表达式
+
+
+
+
+
+ 使用 or 拼接两个 lambda 表达式
+
+
+ true 时生效
+
+
+
+
+
+ 将 lambda 表达式取反
+
+
+ true 时生效
+
+
+
+
+ 使用 and 拼接两个 lambda 表达式
+
+
+
+
+
+ 使用 and 拼接两个 lambda 表达式
+
+
+ true 时生效
+
+
+
+
+
+ 使用 or 拼接两个 lambda 表达式
+
+
+
+
+
+ 使用 or 拼接两个 lambda 表达式
+
+
+ true 时生效
+
+
+
+
+
+ 将 lambda 表达式取反
+
+
+ true 时生效
+
+
+
+
+ 生成类似Mongodb的ObjectId有序、不重复Guid
+
+
+
+
+
+ 插入数据
+
+
+
+
+
+
+ 插入数据,传入实体
+
+
+
+
+
+
+
+ 插入数据,传入实体数组
+
+
+
+
+
+
+
+ 插入数据,传入实体集合
+
+
+
+
+
+
+
+ 插入数据,传入实体集合
+
+
+
+
+
+
+
+ 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下:
+ MySql 5.6+: on duplicate key update
+ PostgreSQL 9.4+: on conflict do update
+ SqlServer 2008+: merge into
+ Oracle 11+: merge into
+ Sqlite: replace into
+ 达梦: merge into
+ 人大金仓:on conflict do update
+ 神通:merge into
+ MsAccess:不支持
+ 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性)
+
+
+
+
+
+
+ 修改数据
+
+
+
+
+
+
+ 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 查询数据
+
+
+
+
+
+
+ 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 删除数据
+
+
+
+
+
+
+ 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 开启事务(不支持异步)
+ v1.5.0 关闭了线程事务超时自动提交的机制
+
+ 事务体 () => {}
+
+
+
+ 开启事务(不支持异步)
+ v1.5.0 关闭了线程事务超时自动提交的机制
+
+
+ 事务体 () => {}
+
+
+
+ 数据库访问对象
+
+
+
+
+ 所有拦截方法都在这里
+
+
+
+
+ CodeFirst 模式开发相关方法
+
+
+
+
+ DbFirst 模式开发相关方法
+
+
+
+
+ 全局过滤设置,可默认附加为 Select/Update/Delete 条件
+
+
+
+