diff --git a/Directory.Build.props b/Directory.Build.props index f0b8ff929..57eab2c77 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,7 +10,7 @@ - 3.2.602 + 3.2.603 diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index d90c657d1..ece0f8504 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -125,7 +125,7 @@ async public Task AddRangeAsync(IEnumerable data, CancellationToken can await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken); return; default: - if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) + if (_tableIdentitys.Length == 1) { foreach (var s in data) await AddPrivAsync(s, false, cancellationToken); diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index cd1178a02..54a8f2162 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -128,7 +128,7 @@ public void AddRange(IEnumerable data) AddOrUpdateNavigateList(item, true, null); return; default: - if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) + if (_tableIdentitys.Length == 1) { foreach (var s in data) AddPriv(s, false); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index da7ace6b1..bdd16ff97 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -538,5 +538,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index 5d116f7e2..32403d206 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +10,7 @@ namespace FreeSql.Tests public class RepositoryTests { /// - /// һ޷¡ + /// 更一条无法更新。 /// /// [Fact] @@ -70,12 +70,12 @@ public void UpdateAttach() repos.Attach(item); item.Title = "xxx"; - repos.Update(item); //ִ UPDATE "AddUpdateInfo" SET "Title" = 'xxx' WHERE("Id" = '1942fb53-9700-411d-8895-ce4cecdf3257') + repos.Update(item); //这行执行 UPDATE "AddUpdateInfo" SET "Title" = 'xxx' WHERE("Id" = '1942fb53-9700-411d-8895-ce4cecdf3257') Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(item)); - repos.Update(item); //вִ SQLδ仯 + repos.Update(item); //这行不执行 SQL,未变化 - repos.AttachOnlyPrimary(item).Update(item); //и״ֵֵֻ̬ڣִи set title = xxx + repos.AttachOnlyPrimary(item).Update(item); //这行更新状态值,只有主键值存在,执行更新 set title = xxx Console.WriteLine(repos.UpdateDiy.Where(a => a.Id == item.Id).Set(a => a.Clicks + 1).ToSql()); repos.UpdateDiy.Where(a => a.Id == item.Id).Set(a => a.Clicks + 1).ExecuteAffrows(); @@ -140,7 +140,7 @@ public void UnitOfWorkRepository() var flowRepos = fsql.GetRepository(); flowRepos.Insert(flow); - // + //事务添加 flow = new FlowModel() { CreateTime = DateTime.Now, @@ -192,7 +192,7 @@ public void UnitOfWorkRepositoryWithoutDisable() var uowFlowRepos = uow.GetRepository(); uowFlowRepos.Insert(flow); uowFlowRepos.Orm.Select().ToList(); - //commitύݿ + //不调用commit将不会提交数据库更改 //uow.Commit(); } Assert.False(flowRepos.Select.Any(a => a.UserId == 1 && a.Name == "aaa")); @@ -241,36 +241,36 @@ public void EnableAddOrUpdateNavigateList_OneToMany() var cts = new[] { new Cagetory { - Name = "1", + Name = "分类1", Goodss = new List(new[] { - new Goods { Name = "Ʒ1" }, - new Goods { Name = "Ʒ2" }, - new Goods { Name = "Ʒ3" } + new Goods { Name = "商品1" }, + new Goods { Name = "商品2" }, + new Goods { Name = "商品3" } }) }, new Cagetory { - Name = "2", + Name = "分类2", Goodss = new List(new[] { - new Goods { Name = "Ʒ4" }, - new Goods { Name = "Ʒ5" } + new Goods { Name = "商品4" }, + new Goods { Name = "商品5" } }) } }; repo.Insert(cts); - cts[0].Name = "11"; + cts[0].Name = "分类11"; cts[0].Goodss.Clear(); - cts[1].Name = "22"; + cts[1].Name = "分类22"; cts[1].Goodss.Clear(); repo.Update(cts); - cts[0].Name = "111"; + cts[0].Name = "分类111"; cts[0].Goodss.Clear(); - cts[0].Goodss.Add(new Goods { Name = "Ʒ33" }); - cts[1].Name = "222"; + cts[0].Goodss.Add(new Goods { Name = "商品33" }); + cts[1].Name = "分类222"; cts[1].Goodss.Clear(); - cts[1].Goodss.Add(new Goods { Name = "Ʒ55" }); + cts[1].Goodss.Add(new Goods { Name = "商品55" }); repo.Update(cts); var cts2 = repo.Select.WhereDynamic(cts).IncludeMany(a => a.Goodss).ToList(); @@ -304,36 +304,36 @@ public void EnableAddOrUpdateNavigateList_OneToMany_lazyloading() var cts = new[] { new CagetoryLD { - Name = "1", + Name = "分类1", Goodss = new List(new[] { - new GoodsLD { Name = "Ʒ1" }, - new GoodsLD { Name = "Ʒ2" }, - new GoodsLD { Name = "Ʒ3" } + new GoodsLD { Name = "商品1" }, + new GoodsLD { Name = "商品2" }, + new GoodsLD { Name = "商品3" } }) }, new CagetoryLD { - Name = "2", + Name = "分类2", Goodss = new List(new[] { - new GoodsLD { Name = "Ʒ4" }, - new GoodsLD { Name = "Ʒ5" } + new GoodsLD { Name = "商品4" }, + new GoodsLD { Name = "商品5" } }) } }; repo.Insert(cts); - cts[0].Name = "11"; + cts[0].Name = "分类11"; cts[0].Goodss.Clear(); - cts[1].Name = "22"; + cts[1].Name = "分类22"; cts[1].Goodss.Clear(); repo.Update(cts); - cts[0].Name = "111"; + cts[0].Name = "分类111"; cts[0].Goodss.Clear(); - cts[0].Goodss.Add(new GoodsLD { Name = "Ʒ33" }); - cts[1].Name = "222"; + cts[0].Goodss.Add(new GoodsLD { Name = "商品33" }); + cts[1].Name = "分类222"; cts[1].Goodss.Clear(); - cts[1].Goodss.Add(new GoodsLD { Name = "Ʒ55" }); + cts[1].Goodss.Add(new GoodsLD { Name = "商品55" }); repo.Update(cts); var cts2 = repo.Select.WhereDynamic(cts).IncludeMany(a => a.Goodss).ToList(); @@ -369,52 +369,52 @@ public class GoodsLD public void SaveMany_OneToMany() { var repo = g.sqlite.GetRepository(); - repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //رռ湦 + repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //关闭级联保存功能 var cts = new[] { new Cagetory { - Name = "1", + Name = "分类1", Goodss = new List(new[] { - new Goods { Name = "Ʒ1" }, - new Goods { Name = "Ʒ2" }, - new Goods { Name = "Ʒ3" } + new Goods { Name = "商品1" }, + new Goods { Name = "商品2" }, + new Goods { Name = "商品3" } }) }, new Cagetory { - Name = "2", + Name = "分类2", Goodss = new List(new[] { - new Goods { Name = "Ʒ4" }, - new Goods { Name = "Ʒ5" } + new Goods { Name = "商品4" }, + new Goods { Name = "商品5" } }) } }; repo.Insert(cts); - repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ - repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[0], "Goodss"); //指定保存 Goodss 一对多属性 + repo.SaveMany(cts[1], "Goodss"); //指定保存 Goodss 一对多属性 cts[0].Goodss.RemoveAt(1); cts[1].Goodss.RemoveAt(1); - repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ - repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[0], "Goodss"); //指定保存 Goodss 一对多属性 + repo.SaveMany(cts[1], "Goodss"); //指定保存 Goodss 一对多属性 - cts[0].Name = "11"; + cts[0].Name = "分类11"; cts[0].Goodss.Clear(); - cts[1].Name = "22"; + cts[1].Name = "分类22"; cts[1].Goodss.Clear(); repo.Update(cts); - repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ - repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ - cts[0].Name = "111"; + repo.SaveMany(cts[0], "Goodss"); //指定保存 Goodss 一对多属性 + repo.SaveMany(cts[1], "Goodss"); //指定保存 Goodss 一对多属性 + cts[0].Name = "分类111"; cts[0].Goodss.Clear(); - cts[0].Goodss.Add(new Goods { Name = "Ʒ33" }); - cts[1].Name = "222"; + cts[0].Goodss.Add(new Goods { Name = "商品33" }); + cts[1].Name = "分类222"; cts[1].Goodss.Clear(); - cts[1].Goodss.Add(new Goods { Name = "Ʒ55" }); + cts[1].Goodss.Add(new Goods { Name = "商品55" }); repo.Update(cts); - repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ - repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[0], "Goodss"); //指定保存 Goodss 一对多属性 + repo.SaveMany(cts[1], "Goodss"); //指定保存 Goodss 一对多属性 } [Fact] @@ -425,42 +425,42 @@ public void EnableAddOrUpdateNavigateList_OneToMany_Parent() var cts = new[] { new CagetoryParent { - Name = "1", + Name = "分类1", Childs = new List(new[] { - new CagetoryParent { Name = "1_1" }, - new CagetoryParent { Name = "1_2" }, - new CagetoryParent { Name = "1_3" } + new CagetoryParent { Name = "分类1_1" }, + new CagetoryParent { Name = "分类1_2" }, + new CagetoryParent { Name = "分类1_3" } }) }, new CagetoryParent { - Name = "2", + Name = "分类2", Childs = new List(new[] { - new CagetoryParent { Name = "2_1" }, - new CagetoryParent { Name = "2_2" } + new CagetoryParent { Name = "分类2_1" }, + new CagetoryParent { Name = "分类2_2" } }) } }; - repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //򿪼湦 + repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //打开级联保存功能 repo.Insert(cts); var notreelist1 = repo.Select.ToList(); var treelist1 = repo.Select.ToTreeList(); - //repo.SaveMany(cts[0], "Childs"); //ָ Childs һԶ - cts[0].Name = "11"; + //repo.SaveMany(cts[0], "Childs"); //指定保存 Childs 一对多属性 + cts[0].Name = "分类11"; cts[0].Childs.Clear(); - cts[1].Name = "22"; + cts[1].Name = "分类22"; cts[1].Childs.Clear(); repo.Update(cts); - cts[0].Name = "111"; + cts[0].Name = "分类111"; cts[0].Childs.Clear(); - cts[0].Childs.Add(new CagetoryParent { Name = "1_33" }); - cts[1].Name = "222"; + cts[0].Childs.Add(new CagetoryParent { Name = "分类1_33" }); + cts[1].Name = "分类222"; cts[1].Childs.Clear(); - cts[1].Childs.Add(new CagetoryParent { Name = "2_22" }); + cts[1].Childs.Add(new CagetoryParent { Name = "分类2_22" }); repo.Update(cts); var treelist2 = repo.Select.ToTreeList(); } @@ -479,16 +479,16 @@ class CagetoryParent public void EnableAddOrUpdateNavigateList_ManyToMany() { var tags = new[] { - new Tag { TagName = "" }, - new Tag { TagName = "80" }, - new Tag { TagName = "00" }, - new Tag { TagName = "ҡ" } + new Tag { TagName = "流行" }, + new Tag { TagName = "80后" }, + new Tag { TagName = "00后" }, + new Tag { TagName = "摇滚" } }; var ss = new[] { new Song { - Name = "һ.mp3", + Name = "爱你一万年.mp3", Tags = new List(new[] { tags[0], tags[1] @@ -496,7 +496,7 @@ public void EnableAddOrUpdateNavigateList_ManyToMany() }, new Song { - Name = ".mp3", + Name = "李白.mp3", Tags = new List(new[] { tags[0], tags[2] @@ -504,23 +504,23 @@ public void EnableAddOrUpdateNavigateList_ManyToMany() } }; var repo = g.sqlite.GetRepository(); - repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //򿪼湦 + repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //打开级联保存功能 repo.Insert(ss); - ss[0].Tags[0].TagName = "101"; - repo.SaveMany(ss[0], "Tags"); //ָ Tags Զ + ss[0].Tags[0].TagName = "流行101"; + repo.SaveMany(ss[0], "Tags"); //指定保存 Tags 多对多属性 - ss[0].Name = "һ.mp5"; + ss[0].Name = "爱你一万年.mp5"; ss[0].Tags.Clear(); ss[0].Tags.Add(tags[0]); - ss[1].Name = ".mp5"; + ss[1].Name = "李白.mp5"; ss[1].Tags.Clear(); ss[1].Tags.Add(tags[3]); repo.Update(ss); - ss[0].Name = "һ.mp4"; + ss[0].Name = "爱你一万年.mp4"; ss[0].Tags.Clear(); - ss[1].Name = ".mp4"; + ss[1].Name = "李白.mp4"; ss[1].Tags.Clear(); repo.Update(ss); } @@ -553,19 +553,19 @@ public void BeginEdit() g.sqlite.Delete().Where("1=1").ExecuteAffrows(); var repo = g.sqlite.GetRepository(); var cts = new[] { - new BeginEdit01 { Name = "1" }, - new BeginEdit01 { Name = "1_1" }, - new BeginEdit01 { Name = "1_2" }, - new BeginEdit01 { Name = "1_3" }, - new BeginEdit01 { Name = "2" }, - new BeginEdit01 { Name = "2_1" }, - new BeginEdit01 { Name = "2_2" } + new BeginEdit01 { Name = "分类1" }, + new BeginEdit01 { Name = "分类1_1" }, + new BeginEdit01 { Name = "分类1_2" }, + new BeginEdit01 { Name = "分类1_3" }, + new BeginEdit01 { Name = "分类2" }, + new BeginEdit01 { Name = "分类2_1" }, + new BeginEdit01 { Name = "分类2_2" } }.ToList(); repo.Insert(cts); repo.BeginEdit(cts); - cts.Add(new BeginEdit01 { Name = "2_3" }); + cts.Add(new BeginEdit01 { Name = "分类2_3" }); cts[0].Name = "123123"; cts.RemoveAt(1); @@ -577,13 +577,13 @@ public void BeginEdit() repo.BeginEdit(cts); cts.AddRange(new[] { - new BeginEdit01 { Name = "1" }, - new BeginEdit01 { Name = "1_1" }, - new BeginEdit01 { Name = "1_2" }, - new BeginEdit01 { Name = "1_3" }, - new BeginEdit01 { Name = "2" }, - new BeginEdit01 { Name = "2_1" }, - new BeginEdit01 { Name = "2_2" } + new BeginEdit01 { Name = "分类1" }, + new BeginEdit01 { Name = "分类1_1" }, + new BeginEdit01 { Name = "分类1_2" }, + new BeginEdit01 { Name = "分类1_3" }, + new BeginEdit01 { Name = "分类2" }, + new BeginEdit01 { Name = "分类2_1" }, + new BeginEdit01 { Name = "分类2_2" } }); Assert.Equal(7, repo.EndEdit()); @@ -600,19 +600,19 @@ public void BeginEditIdentity() fsql.Delete().Where("1=1").ExecuteAffrows(); var repo = fsql.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" } + 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.Add(new BeginEdit02 { Name = "分类2_3" }); cts[0].Name = "123123"; cts.RemoveAt(1); @@ -624,13 +624,13 @@ public void BeginEditIdentity() 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" } + 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()); @@ -747,5 +747,69 @@ class ts_repo_update_bit public int id { get; set; } public bool bool_val { get; set; } } + + [Fact] + public void InsertIdentity() + { + var fsql = g.mysql; + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var repo = fsql.GetRepository(); + + var team = new TaskDetailTeam(); + repo.Insert(team); + + team = new TaskDetailTeam + { + TaskId = 1, + UserId = 11, + IsYanShou = 1, + AccessType = "xxxAccessType1" + }; + repo.Insert(team); + + var teams = new[] + { + new TaskDetailTeam + { + TaskId = 2, + UserId = 22, + IsYanShou = 2, + AccessType = "xxxAccessType2" + },new TaskDetailTeam + { + TaskId = 3, + UserId = 33, + IsYanShou = 3, + AccessType = "xxxAccessType3" + } + }; + repo.Insert(teams); + } + + [Table(Name = "task_detail_team")] + public class TaskDetailTeam + { + [Column(Name = "id", IsPrimary = true, IsIdentity = true)] + public int Id { get; set; } + + [Column(Name = "createdAt", DbType = "datetime", ServerTime = DateTimeKind.Local, CanUpdate = false)] + public DateTime CreatedAt { get; set; } + + [Column(Name = "taskId")] + public int TaskId { get; set; } + + [Column(Name = "updatedAt", DbType = "datetime", ServerTime = DateTimeKind.Local)] + public DateTime UpdatedAt { get; set; } + + [Column(Name = "userId")] + public int UserId { get; set; } + + [Column(Name = "is_yanshou")] + public int IsYanShou { get; set; } + + [Column(IsIgnore = true)] + public string AccessType { get; set; } + } } }