From e0e96957561eb88cb418e12ddd6f42248f80855b Mon Sep 17 00:00:00 2001 From: David Boone Date: Thu, 14 Nov 2024 15:08:48 -0800 Subject: [PATCH] Add support for composite foreign keys to Parsing/MappingVisitor --- .../Parsing/MappingVisitor.cs | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/EntityFrameworkCore.Generator.Core/Parsing/MappingVisitor.cs b/src/EntityFrameworkCore.Generator.Core/Parsing/MappingVisitor.cs index 5c7f9a26..7f29af1c 100644 --- a/src/EntityFrameworkCore.Generator.Core/Parsing/MappingVisitor.cs +++ b/src/EntityFrameworkCore.Generator.Core/Parsing/MappingVisitor.cs @@ -116,6 +116,46 @@ private string ParseLambaExpression(InvocationExpressionSyntax node) return propertyName; } + private List ParseLambdaExpressionForAnonymousObject(InvocationExpressionSyntax node) + { + if (node == null) + return null; + + var lambdaExpression = node + .ArgumentList + .DescendantNodes() + .OfType() + .FirstOrDefault(); + + if (lambdaExpression == null) + return null; + + var anonymousObject = lambdaExpression + .ChildNodes() + .OfType() + .FirstOrDefault(); + + if (anonymousObject == null) + return null; + + var propertyNames = anonymousObject + .ChildNodes() + .OfType() + .Select(declarator => declarator + .ChildNodes() + .OfType() + .FirstOrDefault()) + .Where(memberAccess => memberAccess != null) + .Select(memberAccess => memberAccess + .ChildNodes() + .OfType() + .Select(identifier => identifier.Identifier.ValueText) + .LastOrDefault()) + .Where(propertyName => propertyName != null) + .ToList(); + + return propertyNames; + } private void ParseHasOne(InvocationExpressionSyntax node) { @@ -153,13 +193,17 @@ private void ParseForeignKey(InvocationExpressionSyntax node) if (node == null || ParsedEntity == null) return; - var propertyName = ParseLambaExpression(node); + List propertyNames = null; + if (ParseLambaExpression(node) is string propertyName && !string.IsNullOrEmpty(propertyName)) + propertyNames = new List { propertyName }; + else + propertyNames = ParseLambdaExpressionForAnonymousObject(node); - if (string.IsNullOrEmpty(propertyName)) + if (propertyNames == null) return; _currentRelationship ??= new ParsedRelationship(); - _currentRelationship.Properties.Add(propertyName); + _currentRelationship.Properties.AddRange(propertyNames); } private void ParseConstraintName(InvocationExpressionSyntax node)