From 91522386b1b000b860bcf9682481b90f62441861 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 12 Apr 2022 21:44:31 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20DbContext/Repository?= =?UTF-8?q?=20Update=20=E5=AE=9E=E4=BD=93=E6=9C=89=20ServerTime=20?= =?UTF-8?q?=E6=97=A2=E4=BD=BF=E6=97=A0=E7=8A=B6=E6=80=81=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E4=B9=9F=E5=BF=85=E7=84=B6=E6=9B=B4=E6=96=B0=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ---- .../RepositoryTests.cs | 49 +++++++++++++++++++ FreeSql/Extensions/EntityUtilExtensions.cs | 10 +++- FreeSql/Internal/Model/TableInfo.cs | 1 + FreeSql/Internal/UtilsExpressionTree.cs | 1 + 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index bdd16ff97..da7ace6b1 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -538,14 +538,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index 711772844..00eba288a 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -593,6 +593,55 @@ class BeginEdit01 public Guid Id { get; set; } public string Name { get; set; } } + [Fact] + public void BeginEditIdentity() + { + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + var repo = g.sqlite.GetRepository(); + var cts = new[] { + new BeginEdit02 { Name = "1" }, + new BeginEdit02 { Name = "1_1" }, + new BeginEdit02 { Name = "1_2" }, + new BeginEdit02 { Name = "1_3" }, + new BeginEdit02 { Name = "2" }, + new BeginEdit02 { Name = "2_1" }, + new BeginEdit02 { Name = "2_2" } + }.ToList(); + repo.Insert(cts); + + repo.BeginEdit(cts); + + cts.Add(new BeginEdit02 { Name = "2_3" }); + cts[0].Name = "123123"; + cts.RemoveAt(1); + + Assert.Equal(3, repo.EndEdit()); + + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + repo = g.sqlite.GetRepository(); + cts = repo.Select.ToList(); + repo.BeginEdit(cts); + + cts.AddRange(new[] { + new BeginEdit02 { Name = "1" }, + new BeginEdit02 { Name = "1_1" }, + new BeginEdit02 { Name = "1_2" }, + new BeginEdit02 { Name = "1_3" }, + new BeginEdit02 { Name = "2" }, + new BeginEdit02 { Name = "2_1" }, + new BeginEdit02 { Name = "2_2" } + }); + + Assert.Equal(7, repo.EndEdit()); + } + class BeginEdit02 + { + [Column(IsIdentity = true)] + public int Id { get; set; } + public string Name { get; set; } + [Column(ServerTime = DateTimeKind.Utc)] + public DateTime UpdateTime { get; set; } + } [Fact] public void OrmScoped() diff --git a/FreeSql/Extensions/EntityUtilExtensions.cs b/FreeSql/Extensions/EntityUtilExtensions.cs index 97732054b..b19f13161 100644 --- a/FreeSql/Extensions/EntityUtilExtensions.cs +++ b/FreeSql/Extensions/EntityUtilExtensions.cs @@ -604,7 +604,15 @@ public static string[] CompareEntityValueReturnColumns(this IFreeSql orm, Type e exps.Add(Expression.Label(returnTarget, Expression.Constant(new string[0]))); return Expression.Lambda>(Expression.Block(new[] { var1Ret, var1Parm, var2Parm }, exps), new[] { parm1, parm2, parm3 }).Compile(); }); - return func(entity1, entity2, isEqual); + var result = func(entity1, entity2, isEqual); + var tmptb = orm.CodeFirst.GetTableByEntity(entityType); + if (tmptb.ColumnsByCanUpdateDbUpdateValue.Length > 0) { + if (isEqual && result.Length + tmptb.ColumnsByCanUpdateDbUpdateValue.Length == tmptb.ColumnsByCs.Count) + return result.Concat(tmptb.ColumnsByCanUpdateDbUpdateValue.Select(a => a.Attribute.Name)).ToArray(); + if (!isEqual && result.Length == tmptb.ColumnsByCanUpdateDbUpdateValue.Length) + return new string[0]; + } + return result; } static ConcurrentDictionary>> _dicSetEntityIncrByWithPropertyName = new ConcurrentDictionary>>(); diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs index c09484efa..7de852161 100644 --- a/FreeSql/Internal/Model/TableInfo.cs +++ b/FreeSql/Internal/Model/TableInfo.cs @@ -17,6 +17,7 @@ public class TableInfo public Dictionary ColumnsByCs { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary ColumnsByCsIgnore { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public ColumnInfo[] ColumnsByPosition { get; set; } + public ColumnInfo[] ColumnsByCanUpdateDbUpdateValue { get; set; } public ColumnInfo[] Primarys { get; set; } public IndexInfo[] Indexes { get; set; } public string CsName { get; set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 72a03c23b..08fc5aff8 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -484,6 +484,7 @@ internal static TableInfo GetTableByEntity(Type entity, CommonUtils common) trytb.ColumnsByPosition = columnsList.Where(a => a.Attribute.Position > 0).OrderBy(a => a.Attribute.Position) .Concat(columnsList.Where(a => a.Attribute.Position == 0)) .Concat(columnsList.Where(a => a.Attribute.Position < 0).OrderBy(a => a.Attribute.Position)).ToArray(); + trytb.ColumnsByCanUpdateDbUpdateValue = columnsList.Where(a => a.Attribute.CanUpdate == true && string.IsNullOrEmpty(a.DbUpdateValue) == false).ToArray(); trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsPrimary == true).ToArray(); if (trytb.Primarys.Any() == false)