AggregateRootRepository

This commit is contained in:
2881099 2022-09-03 21:02:21 +08:00
parent d5024068a1
commit 5bbbeb16c2
2 changed files with 112 additions and 33 deletions

View File

@ -140,8 +140,12 @@ namespace FreeSql
foreach (var item in collectionAfter as IEnumerable) foreach (var item in collectionAfter as IEnumerable)
{ {
var key = fsql.GetEntityKeyString(elementType, item, false); var key = fsql.GetEntityKeyString(elementType, item, false);
if (key != null) tracking.InsertLog.Add(NativeTuple.Create(elementType, item)); if (key != null)
else dictAfter.Add(key, item); {
if (dictAfter.ContainsKey(key) == false)
dictAfter.Add(key, item);
}
else tracking.InsertLog.Add(NativeTuple.Create(elementType, item));
} }
foreach (var key in dictBefore.Keys.ToArray()) foreach (var key in dictBefore.Keys.ToArray())
{ {
@ -230,7 +234,7 @@ namespace FreeSql
if (middleValues == null) continue; if (middleValues == null) continue;
statckPath.Push($"{prop.Name}[]"); statckPath.Push($"{prop.Name}[]");
stackValues.Add(middleValues); 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); stackValues.RemoveAt(stackValues.Count - 1);
statckPath.Pop(); statckPath.Pop();
break; break;

View File

@ -30,10 +30,10 @@ namespace FreeSql.Tests.DbContext2
var code = AggregateRootUtils.GetAutoIncludeQueryStaicCode(fsql, typeof(Order)); var code = AggregateRootUtils.GetAutoIncludeQueryStaicCode(fsql, typeof(Order));
Assert.Equal(@"//fsql.Select<Order>() Assert.Equal(@"//fsql.Select<Order>()
SelectDiy SelectDiy
.Include(a => a.Extdata)
.IncludeMany(a => a.Details, then => then .IncludeMany(a => a.Details, then => then
.Include(b => b.Extdata)) .Include(b => b.Extdata))
.IncludeMany(a => a.Tags) .IncludeMany(a => a.Tags)", code);
.Include(a => a.Extdata)", code);
fsql.Insert(new[] fsql.Insert(new[]
{ {
@ -45,42 +45,117 @@ SelectDiy
}).ExecuteAffrows(); }).ExecuteAffrows();
var repo = fsql.GetAggregateRootRepository<Order>(); var repo = fsql.GetAggregateRootRepository<Order>();
var order = new Order var affrows = 0;
Order order2 = null;
LocalTest();
void LocalTest()
{ {
Field2 = "field2", var order = new Order
Extdata = new OrderExt { Field3 = "field3" }, {
Details = new List<OrderDetail> Field2 = "field2",
Extdata = new OrderExt { Field3 = "field3" },
Details = new List<OrderDetail>
{ {
new OrderDetail { Field4 = "field4_01", Extdata = new OrderDetailExt { Field5 = "field5_01" } }, 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_02", Extdata = new OrderDetailExt { Field5 = "field5_02" } },
new OrderDetail { Field4 = "field4_03", Extdata = new OrderDetailExt { Field5 = "field5_03" } }, new OrderDetail { Field4 = "field4_03", Extdata = new OrderDetailExt { Field5 = "field5_03" } },
}, },
Tags = fsql.Select<Tag>().Where(a => new[] { 1, 2, 3 }.Contains(a.Id)).ToList() Tags = fsql.Select<Tag>().Where(a => new[] { 1, 2, 3 }.Contains(a.Id)).ToList()
}; };
repo.Insert(order); //级联插入 repo.Insert(order); //级联插入
var order2 = repo.Select.Where(a => a.Id == a.Id).First(); order2 = repo.Select.Where(a => a.Id == a.Id).First();
Assert.NotNull(order2); Assert.NotNull(order2);
Assert.Equal(order.Id, order2.Id); Assert.Equal(order.Id, order2.Id);
Assert.Equal(order.Field2, order2.Field2); Assert.Equal(order.Field2, order2.Field2);
Assert.NotNull(order2.Extdata); Assert.NotNull(order2.Extdata);
Assert.Equal(order.Extdata.Field3, order2.Extdata.Field3); Assert.Equal(order.Extdata.Field3, order2.Extdata.Field3);
Assert.NotNull(order2.Details); Assert.NotNull(order2.Details);
Assert.Equal(order.Details.Count, order2.Details.Count); Assert.Equal(order.Details.Count, order2.Details.Count);
Assert.Equal(3, order2.Details.Count); for (var a = 0; a < order.Details.Count; a++)
for (var a = 0; a < 3; a++) {
{ Assert.Equal(order.Details[a].Id, order2.Details[a].Id);
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].OrderId, order2.Details[a].OrderId); Assert.Equal(order.Details[a].Field4, order2.Details[a].Field4);
Assert.Equal(order.Details[a].Field4, order2.Details[a].Field4); Assert.NotNull(order2.Details[a].Extdata);
Assert.NotNull(order2.Details[a].Extdata); Assert.Equal(order.Details[a].Extdata.Field5, order2.Details[a].Extdata.Field5);
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); affrows = repo.Delete(order2);
Assert.Equal("tag1", order2.Tags[0].Name); Assert.Equal(10, affrows);
Assert.Equal("tag2", order2.Tags[1].Name); Assert.False(fsql.Select<Order>().Where(a => a.Id == 1).Any());
Assert.Equal("tag3", order2.Tags[2].Name); Assert.False(fsql.Select<OrderExt>().Where(a => a.OrderId == 1).Any());
Assert.False(fsql.Select<OrderDetail>().Where(a => a.OrderId == 1).Any());
Assert.False(fsql.Select<OrderTag>().Where(a => a.OrderId == 1).Any());
Assert.False(fsql.Select<OrderDetailExt>().Any());
var tags = fsql.Select<Tag>().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<Order>().Where(a => a.Id == 2).Any());
Assert.False(fsql.Select<OrderExt>().Where(a => a.OrderId == 2).Any());
Assert.False(fsql.Select<OrderDetail>().Where(a => a.OrderId == 2).Any());
Assert.False(fsql.Select<OrderTag>().Where(a => a.OrderId == 2).Any());
Assert.False(fsql.Select<OrderDetailExt>().Any());
tags = fsql.Select<Tag>().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);
} }
} }