From ff758f338cdd8964b7e34483bd2f65991550916d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 29 Mar 2019 22:31:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20DbContext=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/dbcontext_01/Program.cs | 51 ++++++++++++++++++-- FreeSql.DbContext/DbContext/DbContextSync.cs | 8 ++- FreeSql.DbContext/DbSet/DbSet.cs | 1 + FreeSql.DbContext/DbSet/DbSetSync.cs | 8 ++- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/Examples/dbcontext_01/Program.cs b/Examples/dbcontext_01/Program.cs index 6c883ccf..bdd2cc14 100644 --- a/Examples/dbcontext_01/Program.cs +++ b/Examples/dbcontext_01/Program.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; +using System.Numerics; using System.Threading.Tasks; +using FreeSql; +using FreeSql.DataAnnotations; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -12,10 +16,49 @@ namespace dbcontext_01 { public class Program { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } + + public class Song { + [Column(IsIdentity = true)] + public int Id { get; set; } + public string BigNumber { get; set; } + + [Column(IsVersion = true)]//使用简单 + public long versionRow { get; set; } + } + + public class SongContext : DbContext { + + public DbSet Songs { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder builder) { + builder.UseFreeSql(fsql); + } + } + static IFreeSql fsql; + public static void Main(string[] args) { + fsql = new FreeSql.FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\dd2.db;Pooling=true;Max Pool Size=10") + .UseAutoSyncStructure(true) + .UseLazyLoading(true) + .UseNoneCommandParameter(true) + + .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) + .Build(); + + using (var ctx = new SongContext()) { + var song = new Song { BigNumber = "1000000000000000000" }; + ctx.Songs.Add(song); + + ctx.Songs.Update(song); + + song.BigNumber = (BigInteger.Parse(song.BigNumber) + 1).ToString(); + ctx.Songs.Update(song); + + ctx.SaveChanges(); + } + + CreateWebHostBuilder(args).Build().Run(); + } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) diff --git a/FreeSql.DbContext/DbContext/DbContextSync.cs b/FreeSql.DbContext/DbContext/DbContextSync.cs index ca30bf43..b4e8dc37 100644 --- a/FreeSql.DbContext/DbContext/DbContextSync.cs +++ b/FreeSql.DbContext/DbContext/DbContextSync.cs @@ -59,11 +59,17 @@ namespace FreeSql { states.RemoveAt(states.Count - 1); return; } + if (affrows == -998 || affrows == -997) { //没有执行更新 + var laststate = states[states.Count - 1]; + states.Clear(); + if (affrows == -997) states.Add(laststate); //保留最后一个 + } if (affrows > 0) { _affrows += affrows; var islastNotUpdated = states.Count != affrows; + var laststate = states[states.Count - 1]; states.Clear(); - if (islastNotUpdated) states.Add(oldinfo.state); + if (islastNotUpdated) states.Add(laststate); //保留最后一个 } }; diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 4aee0a70..589253d6 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -76,6 +76,7 @@ namespace FreeSql { this.Key = key; this.Time = DateTime.Now; } + public TEntity OldValue { get; set; } public TEntity Value { get; set; } public string Key { get; set; } public DateTime Time { get; set; } diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 3b276cfd..c423315d 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -156,7 +156,7 @@ namespace FreeSql { if (data?.Count > 0) { if (cuig.Length == _table.Columns.Count) - return data.Count; + return ups.Length == data.Count ? -998 : -997; var updateSource = data.Select(a => a.Value).ToArray(); var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig); @@ -166,6 +166,8 @@ namespace FreeSql { foreach (var newval in data) { if (_states.TryGetValue(newval.Key, out var tryold)) _fsql.MapEntityValue(newval.Value, tryold.Value); + if (newval.OldValue != null) + _fsql.MapEntityValue(newval.Value, newval.OldValue); } return affrows; } @@ -176,7 +178,9 @@ namespace FreeSql { void UpdatePriv(TEntity data, bool isCheck) { if (isCheck && CanUpdate(data, true) == false) return; - EnqueueAction(DbContext.ExecCommandInfoType.Update, this, typeof(EntityState), CreateEntityState(data)); + var state = CreateEntityState(data); + state.OldValue = data; + EnqueueAction(DbContext.ExecCommandInfoType.Update, this, typeof(EntityState), state); } public void Update(TEntity data) => UpdatePriv(data, true); public void UpdateRange(TEntity[] data) { diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 6bb82389..d11a846c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.27 + 0.3.27.1 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.