diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 537315e2..26522f10 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -800,5 +800,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
diff --git a/FreeSql.Repository/AggregateRootRepository.cs b/FreeSql.Repository/AggregateRootRepository.cs
index 2b921ccb..c17d7c2a 100644
--- a/FreeSql.Repository/AggregateRootRepository.cs
+++ b/FreeSql.Repository/AggregateRootRepository.cs
@@ -1,16 +1,9 @@
using FreeSql.Extensions.EntityUtil;
-using FreeSql.Internal;
-using FreeSql.Internal.Model;
using System;
using System.Collections;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
-using System.Reflection;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
namespace FreeSql
{
@@ -156,7 +149,7 @@ namespace FreeSql
get
{
var query = _repository.Select.TrackToList(SelectAggregateRootTracking);
- SelectAggregateRootNavigateReader(query, EntityType, "", new Stack());
+ query = AggregateRootUtils.GetAutoIncludeQuery(query);
return query;
}
}
@@ -166,7 +159,7 @@ namespace FreeSql
/// 2、返回的内容用,可用于配合重写仓储 override Select 属性
/// 返回内容:fsql.Select<T>().Include(...).IncludeMany(...)
///
- protected string SelectAggregateRootStaticCode => $"//fsql.Select<{EntityType.Name}>()\r\nthis.SelectDiy{SelectAggregateRootNavigateReader(1, EntityType, "", new Stack())}";
+ protected string SelectAggregateRootStaticCode => $"//fsql.Select<{EntityType.Name}>()\r\nthis.SelectDiy{AggregateRootUtils.GetAutoIncludeQueryStaicCode(Orm, EntityType)}";
///
/// ISelect.TrackToList 委托,数据返回后自动 Attach
///
@@ -198,83 +191,40 @@ namespace FreeSql
return;
}
}
- void SelectAggregateRootNavigateReader(ISelect currentQuery, Type entityType, string navigatePath, Stack ignores)
- {
- if (ignores.Any(a => a == entityType)) return;
- ignores.Push(entityType);
- var table = Orm.CodeFirst.GetTableByEntity(entityType);
- if (table == null) return;
- if (!string.IsNullOrWhiteSpace(navigatePath)) navigatePath = $"{navigatePath}.";
- foreach (var tr in table.GetAllTableRef())
- {
- var tbref = tr.Value;
- if (tbref.Exception != null) continue;
- var navigateExpression = $"{navigatePath}{tr.Key}";
- switch (tbref.RefType)
- {
- case TableRefType.OneToOne:
- if (ignores.Any(a => a == tbref.RefEntityType)) break;
- currentQuery.IncludeByPropertyName(navigateExpression);
- SelectAggregateRootNavigateReader(currentQuery, tbref.RefEntityType, navigateExpression, ignores);
- break;
- case TableRefType.OneToMany:
- var ignoresCopy = new Stack(ignores.ToArray());
- currentQuery.IncludeByPropertyName(navigateExpression, then =>
- SelectAggregateRootNavigateReader(then, tbref.RefEntityType, "", ignoresCopy));
- break;
- case TableRefType.ManyToMany:
- currentQuery.IncludeByPropertyName(navigateExpression);
- break;
- case TableRefType.PgArrayToMany:
- case TableRefType.ManyToOne: //不属于聚合根
- break;
- }
- }
- ignores.Pop();
- }
- string SelectAggregateRootNavigateReader(int depth, Type entityType, string navigatePath, Stack ignores)
- {
- var code = new StringBuilder();
- if (ignores.Any(a => a == entityType)) return null;
- ignores.Push(entityType);
- var table = Orm.CodeFirst.GetTableByEntity(entityType);
- if (table == null) return null;
- if (!string.IsNullOrWhiteSpace(navigatePath)) navigatePath = $"{navigatePath}.";
- foreach (var tr in table.GetAllTableRef())
- {
- var tbref = tr.Value;
- if (tbref.Exception != null) continue;
- var navigateExpression = $"{navigatePath}{tr.Key}";
- var depthTab = "".PadLeft(depth * 4);
- var lambdaAlias = (char)((byte)'a' + (depth - 1));
- var lambdaStr = $"{lambdaAlias} => {lambdaAlias}.";
- switch (tbref.RefType)
- {
- case TableRefType.OneToOne:
- if (ignores.Any(a => a == tbref.RefEntityType)) break;
- code.Append("\r\n").Append(depthTab).Append(".Include(").Append(lambdaStr).Append(navigateExpression).Append(")");
- code.Append(SelectAggregateRootNavigateReader(depth, tbref.RefEntityType, navigateExpression, ignores));
- break;
- case TableRefType.OneToMany:
- code.Append("\r\n").Append(depthTab).Append(".IncludeMany(").Append(lambdaStr).Append(navigateExpression);
- var thencode = SelectAggregateRootNavigateReader(depth + 1, tbref.RefEntityType, "", new Stack(ignores.ToArray()));
- if (thencode.Length > 0) code.Append(", then => then").Append(thencode);
- code.Append(")");
- break;
- case TableRefType.ManyToMany:
- code.Append("\r\n").Append(depthTab).Append(".IncludeMany(").Append(lambdaStr).Append(navigateExpression).Append(")");
- break;
- case TableRefType.PgArrayToMany:
- code.Append("\r\n//").Append(depthTab).Append(".IncludeMany(").Append(lambdaStr).Append(navigateExpression).Append(")");
- break;
- case TableRefType.ManyToOne: //不属于聚合根
- code.Append("\r\n//").Append(depthTab).Append(".Include(").Append(lambdaStr).Append(navigateExpression).Append(")");
- break;
- }
- }
- ignores.Pop();
- return code.ToString();
- }
+ //void SelectAggregateRootNavigateReader(ISelect currentQuery, Type entityType, string navigatePath, Stack ignores)
+ //{
+ // if (ignores.Any(a => a == entityType)) return;
+ // ignores.Push(entityType);
+ // var table = Orm.CodeFirst.GetTableByEntity(entityType);
+ // if (table == null) return;
+ // if (!string.IsNullOrWhiteSpace(navigatePath)) navigatePath = $"{navigatePath}.";
+ // foreach (var tr in table.GetAllTableRef())
+ // {
+ // var tbref = tr.Value;
+ // if (tbref.Exception != null) continue;
+ // var navigateExpression = $"{navigatePath}{tr.Key}";
+ // switch (tbref.RefType)
+ // {
+ // case TableRefType.OneToOne:
+ // if (ignores.Any(a => a == tbref.RefEntityType)) break;
+ // currentQuery.IncludeByPropertyName(navigateExpression);
+ // SelectAggregateRootNavigateReader(currentQuery, tbref.RefEntityType, navigateExpression, ignores);
+ // break;
+ // case TableRefType.OneToMany:
+ // var ignoresCopy = new Stack(ignores.ToArray());
+ // currentQuery.IncludeByPropertyName(navigateExpression, then =>
+ // SelectAggregateRootNavigateReader(then, tbref.RefEntityType, "", ignoresCopy)); //variable 'then' of type 'FreeSql.ISelect`1[System.Object]' referenced from scope '', but it is not defined
+ // break;
+ // case TableRefType.ManyToMany:
+ // currentQuery.IncludeByPropertyName(navigateExpression);
+ // break;
+ // case TableRefType.PgArrayToMany:
+ // case TableRefType.ManyToOne: //不属于聚合根
+ // break;
+ // }
+ // }
+ // ignores.Pop();
+ //}
#endregion
}
diff --git a/FreeSql.Repository/AggregateRootUtils.cs b/FreeSql.Repository/AggregateRootUtils.cs
index 16e83596..214c3a62 100644
--- a/FreeSql.Repository/AggregateRootUtils.cs
+++ b/FreeSql.Repository/AggregateRootUtils.cs
@@ -1,6 +1,7 @@
using FreeSql;
using FreeSql.Extensions.EntityUtil;
using FreeSql.Internal;
+using FreeSql.Internal.CommonProvider;
using FreeSql.Internal.Model;
using System;
using System.Collections;
@@ -8,7 +9,9 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
+using System.Linq.Expressions;
using System.Reflection;
+using System.Text;
static class AggregateRootUtils
{
@@ -85,13 +88,13 @@ static class AggregateRootUtils
switch (tbref.RefType)
{
case TableRefType.OneToOne:
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityBefore, propvalBefore);
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityAfter, propvalAfter);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entityBefore, propvalBefore);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entityAfter, propvalAfter);
LocalCompareEntityValue(tbref.RefEntityType, propvalBefore, propvalAfter, null);
break;
case TableRefType.OneToMany:
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityBefore, propvalBefore);
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityAfter, propvalAfter);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entityBefore, propvalBefore);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entityAfter, propvalAfter);
LocalCompareEntityValueCollection(tbref, propvalBefore as IEnumerable, propvalAfter as IEnumerable);
break;
case TableRefType.ManyToMany:
@@ -201,7 +204,7 @@ static class AggregateRootUtils
var propval = table.GetPropertyValue(entity, prop.Name);
statckPath.Push(prop.Name);
stackValues.Add(propval);
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entity, propval);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entity, propval);
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
LocalNavigateReader(tbref.RefEntityType, propval);
stackValues.RemoveAt(stackValues.Count - 1);
@@ -209,7 +212,7 @@ static class AggregateRootUtils
break;
case TableRefType.OneToMany:
var propvalOtm = table.GetPropertyValue(entity, prop.Name);
- SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entity, propvalOtm);
+ SetNavigateRelationshipValue(fsql, tbref, table.Type, entity, propvalOtm);
var propvalOtmList = new List