- 修复 DbContext/Repository Update 不更新 DbUpdateValue 的问题;#219

This commit is contained in:
28810 2020-02-28 10:41:03 +08:00
parent 761b6e0068
commit f22f65fee9
17 changed files with 321 additions and 18 deletions

View File

@ -110,13 +110,6 @@
清空状态数据 清空状态数据
</summary> </summary>
</member> </member>
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据 lambda 条件删除数据
</summary>
<param name="predicate"></param>
<returns></returns>
</member>
<member name="M:FreeSql.DbSet`1.Add(`0)"> <member name="M:FreeSql.DbSet`1.Add(`0)">
<summary> <summary>
添加 添加

View File

@ -17,6 +17,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" /> <ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
<ProjectReference Include="..\..\FreeSql.DbContext\FreeSql.DbContext.csproj" />
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" /> <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MySqlConnector\FreeSql.Provider.MySqlConnector.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySqlConnector\FreeSql.Provider.MySqlConnector.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -57,6 +57,30 @@ namespace FreeSql.Tests.MySqlConnector
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
g.mysql.Update<2>().SetSource(item2).ExecuteAffrows(); g.mysql.Update<2>().SetSource(item2).ExecuteAffrows();
item. = "测试标题更新";
Assert.Equal(1, g.mysql.Update<2>().SetSource(item).ExecuteAffrows());
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.mysql.GetRepository<2>();
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class 2 class 2
{ {

View File

@ -28,6 +28,28 @@ namespace FreeSql.Tests.Odbc.Dameng
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.dameng.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.dameng.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.dameng.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.dameng.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.dameng.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -25,6 +25,28 @@ namespace FreeSql.Tests.Odbc.Default
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.odbc.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.odbc.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.odbc.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.odbc.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.odbc.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -55,6 +55,28 @@ namespace FreeSql.Tests.Odbc.MySql
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.mysql.Update<2>().SetSource(item).ExecuteAffrows());
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.mysql.GetRepository<2>();
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class 2 class 2
{ {

View File

@ -28,6 +28,28 @@ namespace FreeSql.Tests.Odbc.Oracle
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.oracle.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.oracle.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -32,6 +32,28 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.pgsql.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.pgsql.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -29,6 +29,28 @@ namespace FreeSql.Tests.Odbc.SqlServer
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.sqlserver.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.sqlserver.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -28,6 +28,28 @@ namespace FreeSql.Tests.MsAccess
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.msaccess.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.msaccess.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.msaccess.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.msaccess.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.msaccess.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -52,6 +52,28 @@ namespace FreeSql.Tests.MySql
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item.22 = "测试标题更新";
Assert.Equal(1, g.mysql.Update<2>().SetSource(item).ExecuteAffrows());
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item.22, item2.22);
item.22 = "测试标题更新_repo";
var repo = g.mysql.GetRepository<2>();
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item.22, item2.22);
item.22 = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.mysql.Select<2>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item.22, item2.22);
} }
class 2 class 2
{ {
@ -60,6 +82,8 @@ namespace FreeSql.Tests.MySql
public string { get; protected set; } public string { get; protected set; }
public string 22 { get; set; }
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
public DateTime { get; protected set; } public DateTime { get; protected set; }
@ -68,7 +92,7 @@ namespace FreeSql.Tests.MySql
public static 2 Create(string title, DateTime ctm) public static 2 Create(string title, DateTime ctm)
{ {
return new 2 { = title, = ctm }; return new 2 { = title, 22 = title, = ctm };
} }
} }

View File

@ -28,6 +28,28 @@ namespace FreeSql.Tests.Oracle
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.oracle.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.oracle.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.oracle.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -35,6 +35,28 @@ namespace FreeSql.Tests.PostgreSQL
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.pgsql.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.pgsql.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -29,6 +29,28 @@ namespace FreeSql.Tests.SqlServer
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.sqlserver.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.sqlserver.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.sqlserver.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -56,6 +56,28 @@ namespace FreeSql.Tests.Sqlite
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新";
Assert.Equal(1, g.sqlite.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.sqlite.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo";
var repo = g.sqlite.GetRepository<>();
Assert.Equal(1, repo.Update(item));
item2 = g.sqlite.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
item. = "测试标题更新_repo22";
Assert.Equal(1, repo.Update(item));
item2 = g.sqlite.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2);
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
} }
class class
{ {

View File

@ -57,6 +57,14 @@ namespace FreeSql.Tests
.Any()) .Any())
.ToSql(a => a.Name); .ToSql(a => a.Name);
sql = context.Songs
.Where(a =>
context.Authors
.Select //加上这句就不报错,不加上报 variable 'a' of type 'Song' referenced from scope '', but it is not defined
.Where(b => b.SongId == a.Id)
.Any())
.ToSql(a => a.Name);
//using (var conn = new SqlConnection("Data Source=.;Integrated Security=True;Initial Catalog=webchat-abc;Pooling=true;Max Pool Size=13")) //using (var conn = new SqlConnection("Data Source=.;Integrated Security=True;Initial Catalog=webchat-abc;Pooling=true;Max Pool Size=13"))
//{ //{
// conn.Open(); // conn.Open();

View File

@ -553,20 +553,31 @@ namespace FreeSql.Extensions.EntityUtil
{ {
if (_table.ColumnsByCs.TryGetValue(prop.Name, out var trycol) == false) continue; if (_table.ColumnsByCs.TryGetValue(prop.Name, out var trycol) == false) continue;
exps.Add( exps.Add(
Expression.IfThenElse( trycol.Attribute.CanUpdate == false ?
Expression.Equal(
Expression.MakeMemberAccess(var1Parm, prop),
Expression.MakeMemberAccess(var2Parm, prop)
),
Expression.IfThen( Expression.IfThen(
Expression.IsTrue(parm3), Expression.IsTrue(parm3),
Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name)) Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name))
), ) : (
Expression.IfThen( trycol.Attribute.CanUpdate && string.IsNullOrEmpty(trycol.DbUpdateValue) == false ?
Expression.IsFalse(parm3), Expression.IfThen(
Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name)) Expression.IsFalse(parm3),
Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name))
) :
Expression.IfThenElse(
Expression.Equal(
Expression.MakeMemberAccess(var1Parm, prop),
Expression.MakeMemberAccess(var2Parm, prop)
),
Expression.IfThen(
Expression.IsTrue(parm3),
Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name))
),
Expression.IfThen(
Expression.IsFalse(parm3),
Expression.Call(var1Ret, typeof(List<string>).GetMethod("Add", new Type[] { typeof(string) }), Expression.Constant(trycol.Attribute.Name))
)
)
) )
)
); );
a++; a++;
} }