diff --git a/FreeSql.Repository/AggregateRootUtils.cs b/FreeSql.Repository/AggregateRootUtils.cs index ede67833..fa84145e 100644 --- a/FreeSql.Repository/AggregateRootUtils.cs +++ b/FreeSql.Repository/AggregateRootUtils.cs @@ -140,8 +140,12 @@ namespace FreeSql foreach (var item in collectionAfter as IEnumerable) { var key = fsql.GetEntityKeyString(elementType, item, false); - if (key != null) tracking.InsertLog.Add(NativeTuple.Create(elementType, item)); - else dictAfter.Add(key, item); + if (key != null) + { + if (dictAfter.ContainsKey(key) == false) + dictAfter.Add(key, item); + } + else tracking.InsertLog.Add(NativeTuple.Create(elementType, item)); } foreach (var key in dictBefore.Keys.ToArray()) { @@ -230,7 +234,7 @@ namespace FreeSql if (middleValues == null) continue; statckPath.Push($"{prop.Name}[]"); stackValues.Add(middleValues); - callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues); + callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefMiddleEntityType, stackValues); stackValues.RemoveAt(stackValues.Count - 1); statckPath.Pop(); break; diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs b/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs index 010b5416..a5d4da34 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs @@ -30,10 +30,10 @@ namespace FreeSql.Tests.DbContext2 var code = AggregateRootUtils.GetAutoIncludeQueryStaicCode(fsql, typeof(Order)); Assert.Equal(@"//fsql.Select() SelectDiy + .Include(a => a.Extdata) .IncludeMany(a => a.Details, then => then .Include(b => b.Extdata)) - .IncludeMany(a => a.Tags) - .Include(a => a.Extdata)", code); + .IncludeMany(a => a.Tags)", code); fsql.Insert(new[] { @@ -45,42 +45,117 @@ SelectDiy }).ExecuteAffrows(); var repo = fsql.GetAggregateRootRepository(); - var order = new Order + var affrows = 0; + Order order2 = null; + + LocalTest(); + void LocalTest() { - Field2 = "field2", - Extdata = new OrderExt { Field3 = "field3" }, - Details = new List + var order = new Order + { + Field2 = "field2", + Extdata = new OrderExt { Field3 = "field3" }, + Details = new List { new OrderDetail { Field4 = "field4_01", Extdata = new OrderDetailExt { Field5 = "field5_01" } }, new OrderDetail { Field4 = "field4_02", Extdata = new OrderDetailExt { Field5 = "field5_02" } }, new OrderDetail { Field4 = "field4_03", Extdata = new OrderDetailExt { Field5 = "field5_03" } }, }, - Tags = fsql.Select().Where(a => new[] { 1, 2, 3 }.Contains(a.Id)).ToList() - }; - repo.Insert(order); //级联插入 + Tags = fsql.Select().Where(a => new[] { 1, 2, 3 }.Contains(a.Id)).ToList() + }; + repo.Insert(order); //级联插入 - var order2 = repo.Select.Where(a => a.Id == a.Id).First(); - Assert.NotNull(order2); - Assert.Equal(order.Id, order2.Id); - Assert.Equal(order.Field2, order2.Field2); - Assert.NotNull(order2.Extdata); - Assert.Equal(order.Extdata.Field3, order2.Extdata.Field3); - Assert.NotNull(order2.Details); - Assert.Equal(order.Details.Count, order2.Details.Count); - Assert.Equal(3, order2.Details.Count); - for (var a = 0; a < 3; a++) - { - Assert.Equal(order.Details[a].Id, order2.Details[a].Id); - Assert.Equal(order.Details[a].OrderId, order2.Details[a].OrderId); - Assert.Equal(order.Details[a].Field4, order2.Details[a].Field4); - Assert.NotNull(order2.Details[a].Extdata); - Assert.Equal(order.Details[a].Extdata.Field5, order2.Details[a].Extdata.Field5); + order2 = repo.Select.Where(a => a.Id == a.Id).First(); + Assert.NotNull(order2); + Assert.Equal(order.Id, order2.Id); + Assert.Equal(order.Field2, order2.Field2); + Assert.NotNull(order2.Extdata); + Assert.Equal(order.Extdata.Field3, order2.Extdata.Field3); + Assert.NotNull(order2.Details); + Assert.Equal(order.Details.Count, order2.Details.Count); + for (var a = 0; a < order.Details.Count; a++) + { + Assert.Equal(order.Details[a].Id, order2.Details[a].Id); + Assert.Equal(order.Details[a].OrderId, order2.Details[a].OrderId); + Assert.Equal(order.Details[a].Field4, order2.Details[a].Field4); + Assert.NotNull(order2.Details[a].Extdata); + Assert.Equal(order.Details[a].Extdata.Field5, order2.Details[a].Extdata.Field5); + } + Assert.NotNull(order2.Tags); + Assert.Equal(order.Tags.Count, order2.Tags.Count); + for (var a = 0; a < order.Tags.Count; a++) + Assert.Equal(order.Tags[a].Id, order2.Tags[a].Id); + Assert.Equal("tag1", order2.Tags[0].Name); + Assert.Equal("tag2", order2.Tags[1].Name); + Assert.Equal("tag3", order2.Tags[2].Name); + + order.Tags.Add(new Tag { Id = 4 }); + order.Details.RemoveAt(1); + order.Details[0].Extdata.Field5 = "field5_01_01"; + order.Field2 = "field2_02"; + affrows = repo.Update(order); + Assert.Equal(5, affrows); + + order2 = repo.Select.Where(a => a.Id == a.Id).First(); + Assert.NotNull(order2); + Assert.Equal(order.Id, order2.Id); + Assert.Equal("field2_02", order2.Field2); + Assert.NotNull(order2.Extdata); + Assert.Equal(order.Extdata.Field3, order2.Extdata.Field3); + Assert.NotNull(order2.Details); + Assert.Equal(order.Details.Count, order2.Details.Count); + Assert.Equal(2, order2.Details.Count); + + Assert.Equal(order.Details[0].Id, order2.Details[0].Id); + Assert.Equal(order.Details[0].OrderId, order2.Details[0].OrderId); + Assert.Equal("field4_01", order2.Details[0].Field4); + Assert.NotNull(order2.Details[0].Extdata); + Assert.Equal("field5_01_01", order2.Details[0].Extdata.Field5); + Assert.Equal(order.Details[1].Id, order2.Details[1].Id); + Assert.Equal(order.Details[1].OrderId, order2.Details[1].OrderId); + Assert.Equal("field4_03", order2.Details[1].Field4); + Assert.NotNull(order2.Details[1].Extdata); + Assert.Equal("field5_03", order2.Details[1].Extdata.Field5); + + Assert.NotNull(order2.Tags); + Assert.Equal(4, order2.Tags.Count); + Assert.Equal("tag1", order2.Tags[0].Name); + Assert.Equal("tag2", order2.Tags[1].Name); + Assert.Equal("tag3", order2.Tags[2].Name); + Assert.Equal("tag4", order2.Tags[3].Name); } - Assert.NotNull(order2.Tags); - Assert.Equal(3, order2.Tags.Count); - Assert.Equal("tag1", order2.Tags[0].Name); - Assert.Equal("tag2", order2.Tags[1].Name); - Assert.Equal("tag3", order2.Tags[2].Name); + + affrows = repo.Delete(order2); + Assert.Equal(10, affrows); + Assert.False(fsql.Select().Where(a => a.Id == 1).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 1).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 1).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 1).Any()); + Assert.False(fsql.Select().Any()); + var tags = fsql.Select().ToList(); + Assert.Equal(5, tags.Count); + Assert.Equal("tag1", tags[0].Name); + Assert.Equal("tag2", tags[1].Name); + Assert.Equal("tag3", tags[2].Name); + Assert.Equal("tag4", tags[3].Name); + Assert.Equal("tag5", tags[4].Name); + + LocalTest(); + var deleted = repo.DeleteCascadeByDatabase(a => a.Id == 2); + Assert.NotNull(deleted); + Assert.Equal(10, deleted.Count); + Assert.False(fsql.Select().Where(a => a.Id == 2).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 2).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 2).Any()); + Assert.False(fsql.Select().Where(a => a.OrderId == 2).Any()); + Assert.False(fsql.Select().Any()); + tags = fsql.Select().ToList(); + Assert.Equal(5, tags.Count); + Assert.Equal("tag1", tags[0].Name); + Assert.Equal("tag2", tags[1].Name); + Assert.Equal("tag3", tags[2].Name); + Assert.Equal("tag4", tags[3].Name); + Assert.Equal("tag5", tags[4].Name); } }