diff --git a/EFCore.VisualBasic/Design/EFCoreVisualBasicServices.vb b/EFCore.VisualBasic/Design/EFCoreVisualBasicServices.vb
index 244b999..3a49ff3 100644
--- a/EFCore.VisualBasic/Design/EFCoreVisualBasicServices.vb
+++ b/EFCore.VisualBasic/Design/EFCoreVisualBasicServices.vb
@@ -15,10 +15,6 @@ Namespace Design
.AddSingleton(Of IVisualBasicHelper, VisualBasicHelper)()
.AddSingleton(Of IMigrationsCodeGenerator, VisualBasicMigrationsGenerator)()
.AddSingleton(Of IModelCodeGenerator, VisualBasicModelGenerator)()
-
- 'Compiled Models
- .AddSingleton(Of IVisualBasicRuntimeAnnotationCodeGenerator, VisualBasicRuntimeAnnotationCodeGenerator)
- .AddSingleton(Of ICompiledModelCodeGenerator, VisualBasicRuntimeModelCodeGenerator)
End With
End Sub
End Class
diff --git a/EFCore.VisualBasic/Design/IVisualBasicHelper.vb b/EFCore.VisualBasic/Design/IVisualBasicHelper.vb
index 2b0f11d..e69d988 100644
--- a/EFCore.VisualBasic/Design/IVisualBasicHelper.vb
+++ b/EFCore.VisualBasic/Design/IVisualBasicHelper.vb
@@ -350,33 +350,5 @@ Namespace Design
''' The fully qualified namespace of the imported type
'''
Function ImportsClause(currentTypeNamespace As String, importedTypeNamespace As String) As String
-
- '''
- ''' Translates a node representing a statement into source code that would produce it.
- '''
- ''' The node to be translated.
- ''' Any namespaces required by the translated code will be added to this set.
- ''' Source code that would produce .
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Function Statement(node As Expressions.Expression, collectedNamespaces As ISet(Of String)) As String
-
- '''
- ''' Translates a node representing an expression into source code that would produce it.
- '''
- ''' The node to be translated.
- ''' Any namespaces required by the translated code will be added to this set.
- ''' Source code that would produce .
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Function Expression(node As Expressions.Expression, collectedNamespaces As ISet(Of String)) As String
End Interface
End Namespace
diff --git a/EFCore.VisualBasic/Design/IVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/IVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index 4670158..0000000
--- a/EFCore.VisualBasic/Design/IVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,140 +0,0 @@
-Imports System.Runtime.CompilerServices
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-
-Namespace Design
- '''
- ''' Implemented by database providers to generate the code for annotations.
- '''
- '''
- ''' The service lifetime Is . This means a single instance
- ''' Is used by many instances. The implementation must be thread-safe.
- ''' This service cannot depend on services registered as .
- '''
- Public Interface IVisualBasicRuntimeAnnotationCodeGenerator
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The model to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(model As IModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The entity type to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(entityType As IEntityType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The entity type to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(complexProperty As IComplexProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The entity type to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(complexType As IComplexType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The property to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate([property] As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The property to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate([property] As IServiceProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The key to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(key As IKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The foreign key to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(foreignKey As IForeignKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The navigation to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(navigation As INavigation, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The skip navigation to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(navigation As ISkipNavigation, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The index to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(index As IIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The trigger to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(trigger As ITrigger, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The scalar type configuration to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Sub Generate(typeConfiguration As ITypeMappingConfiguration, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- '''
- ''' Generates code to create the given property type mapping.
- '''
- ''' The type mapping to create.
- ''' Additional parameters used during code generation.
- ''' The value comparer that should be used instead of the one in the type mapping.
- ''' The key value comparer that should be used instead of the one in the type mapping.
- ''' The provider value comparer that should be used instead of the one in the type mapping.
- Function Create(
- typeMapping As CoreTypeMapping,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- Optional valueComparer As ValueComparer = Nothing,
- Optional keyValueComparer As ValueComparer = Nothing,
- Optional providerValueComparer As ValueComparer = Nothing) As Boolean
- End Interface
-
- Module IVisualBasicRuntimeAnnotationCodeGeneratorExtensions
- '''
- ''' Generates code to create the given property type mapping.
- '''
- ''' The type mapping to create.
- ''' The property to which this type mapping will be applied.
- ''' Additional parameters used during code generation.
-
- Function Create(service As IVisualBasicRuntimeAnnotationCodeGenerator, typeMapping As CoreTypeMapping, [property] As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As Boolean
- Return service.Create(
- typeMapping,
- parameters,
- [property].GetValueComparer(),
- [property].GetKeyValueComparer(),
- [property].GetProviderValueComparer())
- End Function
- End Module
-End Namespace
diff --git a/EFCore.VisualBasic/Design/Internal/VisualBasicHelper.vb b/EFCore.VisualBasic/Design/Internal/VisualBasicHelper.vb
index 7c9673c..85c95d3 100644
--- a/EFCore.VisualBasic/Design/Internal/VisualBasicHelper.vb
+++ b/EFCore.VisualBasic/Design/Internal/VisualBasicHelper.vb
@@ -5,9 +5,7 @@ Imports System.Runtime.CompilerServices
Imports System.Security
Imports System.Text
Imports EntityFrameworkCore.VisualBasic
-Imports EntityFrameworkCore.VisualBasic.Design.Query.Internal
Imports Microsoft.CodeAnalysis
-Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.EntityFrameworkCore.Design
Imports Microsoft.EntityFrameworkCore.Internal
@@ -25,17 +23,11 @@ Namespace Design.Internal
Implements IVisualBasicHelper
Private ReadOnly _typeMappingSource As ITypeMappingSource
- Private ReadOnly _translator As LinqToVisualBasicSyntaxTranslator
Sub New(typeMappingSource As ITypeMappingSource)
NotNull(typeMappingSource, NameOf(typeMappingSource))
_typeMappingSource = typeMappingSource
-
- Dim workspace = New AdhocWorkspace()
- Dim syntaxGen = SyntaxGenerator.GetGenerator(workspace, LanguageNames.VisualBasic)
-
- _translator = New LinqToVisualBasicSyntaxTranslator(syntaxGen)
End Sub
Private Shared ReadOnly _literalFuncs As New Dictionary(Of Type, Func(Of VisualBasicHelper, Object, String)) From {
@@ -1309,34 +1301,6 @@ Namespace Design.Internal
Return node.NormalizeWhitespace().ToFullString()
End Function
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable Function Statement(node As Expression, collectedNamespaces As ISet(Of String)) As String _
- Implements IVisualBasicHelper.Statement
- Dim sb As New StringBuilder
-
- For Each e In _translator.TranslateStatement(node, collectedNamespaces)
- sb.AppendLine(ToSourceCode(e))
- Next
-
- Return sb.ToString()
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable Function Expression(node As Expression, collectedNamespaces As ISet(Of String)) As String _
- Implements IVisualBasicHelper.Expression
- Return ToSourceCode(_translator.TranslateExpression(node, collectedNamespaces))
- End Function
-
#Region "VB Namespace"
'''
''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
diff --git a/EFCore.VisualBasic/Design/Query/Internal/ILinqToVisualBasicSyntaxTranslator.vb b/EFCore.VisualBasic/Design/Query/Internal/ILinqToVisualBasicSyntaxTranslator.vb
deleted file mode 100644
index 8b2a0b9..0000000
--- a/EFCore.VisualBasic/Design/Query/Internal/ILinqToVisualBasicSyntaxTranslator.vb
+++ /dev/null
@@ -1,56 +0,0 @@
-Imports System.Linq.Expressions
-Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
-
-Namespace Design.Query.Internal
-
- '''
- ''' Translates a LINQ expression tree to a Roslyn syntax tree.
- '''
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Interface ILinqToVisualBasicSyntaxTranslator
-
- '''
- ''' Translates a node representing a statement into a collection of Roslyn syntax tree.
- '''
- ''' The node to be translated.
- ''' Any namespaces required by the translated code will be added to this set.
- ''' A collection of Roslyn syntax tree representation of .
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Function TranslateStatement(node As Expression, collectedNamespaces As ISet(Of String)) As IReadOnlyList(Of StatementSyntax)
-
- '''
- ''' Translates a node representing an expression into a Roslyn syntax tree.
- '''
- ''' The node to be translated.
- ''' Any namespaces required by the translated code will be added to this set.
- ''' A Roslyn syntax tree representation of .
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Function TranslateExpression(node As Expression, collectedNamespaces As ISet(Of String)) As ExpressionSyntax
-
- '''
- ''' Returns the captured variables detected in the last translation.
- '''
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- ReadOnly Property CapturedVariables As IReadOnlySet(Of ParameterExpression)
- End Interface
-End Namespace
diff --git a/EFCore.VisualBasic/Design/Query/Internal/LinqToVisualBasicSyntaxTranslator.vb b/EFCore.VisualBasic/Design/Query/Internal/LinqToVisualBasicSyntaxTranslator.vb
deleted file mode 100644
index 9b81e03..0000000
--- a/EFCore.VisualBasic/Design/Query/Internal/LinqToVisualBasicSyntaxTranslator.vb
+++ /dev/null
@@ -1,2827 +0,0 @@
-Imports System.Globalization
-Imports System.Linq.Expressions
-Imports System.Reflection
-Imports System.Runtime.CompilerServices
-Imports System.Text
-Imports Microsoft.CodeAnalysis
-Imports Microsoft.CodeAnalysis.Editing
-Imports Microsoft.CodeAnalysis.VisualBasic
-Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
-Imports Microsoft.EntityFrameworkCore.Query
-Imports E = System.Linq.Expressions.Expression
-Imports SF = Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory
-
-Namespace Design.Query.Internal
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Class LinqToVisualBasicSyntaxTranslator
- Inherits ExpressionVisitor
- Implements ILinqToVisualBasicSyntaxTranslator
-
- Private NotInheritable Class StackFrame
- ReadOnly Property Variables As Dictionary(Of ParameterExpression, String)
- ReadOnly Property VariableNames As HashSet(Of String)
-
- Sub New(variables As Dictionary(Of ParameterExpression, String),
- variableNames As HashSet(Of String))
-
- Me.Variables = variables
- Me.VariableNames = variableNames
- End Sub
- End Class
-
- Private ReadOnly _stack As New Stack(Of StackFrame)({New StackFrame(New Dictionary(Of ParameterExpression, String),
- New HashSet(Of String)(StringComparer.OrdinalIgnoreCase))})
-
- Private _labels As Dictionary(Of LabelTarget, String)
- Private _unnamedLabelNames As HashSet(Of String)
-
- Private _unnamedParameterCounter As Integer
-
- Private NotInheritable Class LiftedState
- ReadOnly Property Statements As List(Of StatementSyntax)
- ReadOnly Property Variables As Dictionary(Of ParameterExpression, String)
- ReadOnly Property VariableNames As HashSet(Of String)
- ReadOnly Property UnassignedVariableDeclarations As List(Of LocalDeclarationStatementSyntax)
-
- Sub New(statements As List(Of StatementSyntax),
- variables As Dictionary(Of ParameterExpression, String),
- variableNames As HashSet(Of String),
- unassignedVariableDeclarations As List(Of LocalDeclarationStatementSyntax))
-
- Me.Statements = statements
- Me.Variables = variables
- Me.VariableNames = variableNames
- Me.UnassignedVariableDeclarations = unassignedVariableDeclarations
- End Sub
-
- Public Shared Function CreateEmpty() As LiftedState
- Return New LiftedState(New List(Of StatementSyntax),
- New Dictionary(Of ParameterExpression, String),
- New HashSet(Of String)(StringComparer.OrdinalIgnoreCase),
- New List(Of LocalDeclarationStatementSyntax))
- End Function
- End Class
-
- Private _liftedState As LiftedState = LiftedState.CreateEmpty()
-
- Private _context As ExpressionContext
- Private _onLastLambdaLine As Boolean
-
- Private ReadOnly _capturedVariables As New HashSet(Of ParameterExpression)
- Private _collectedNamespaces As ISet(Of String)
-
- Private Shared _activatorCreateInstanceMethod As MethodInfo
- Private Shared _typeGetFieldMethod As MethodInfo
- Private Shared _fieldGetValueMethod As MethodInfo
- Private Shared _AscW As MethodInfo
- Private Shared _ChrW As MethodInfo
-
- Private ReadOnly _sideEffectDetector As New SideEffectDetectionSyntaxWalker
- Private ReadOnly _g As SyntaxGenerator
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Sub New(syntaxGenerator As SyntaxGenerator)
- _g = syntaxGenerator
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public ReadOnly Property CapturedVariables As IReadOnlySet(Of ParameterExpression) Implements ILinqToVisualBasicSyntaxTranslator.CapturedVariables
- Get
- Return _capturedVariables.ToHashSet()
- End Get
- End Property
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- ''' '''
- Protected Overridable Property Result As New GeneratedSyntaxNodes
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable Function TranslateStatement(node As Expression, collectedNamespaces As ISet(Of String)) As IReadOnlyList(Of StatementSyntax) _
- Implements ILinqToVisualBasicSyntaxTranslator.TranslateStatement
- Return ResultAsStatementSyntaxList(TranslateCore(node, collectedNamespaces, statementContext:=True))
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable Function TranslateExpression(node As Expression, collectedNamespaces As ISet(Of String)) As ExpressionSyntax _
- Implements ILinqToVisualBasicSyntaxTranslator.TranslateExpression
- Return TranslateCore(node, collectedNamespaces, statementContext:=False).GetExpression
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function TranslateCore(node As Expression,
- collectedNamespaces As ISet(Of String),
- Optional statementContext As Boolean = False) As GeneratedSyntaxNodes
-
- _labels = New Dictionary(Of LabelTarget, String)
- _unnamedLabelNames = New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
- _capturedVariables.Clear()
- _collectedNamespaces = collectedNamespaces
- _unnamedParameterCounter = 0
- _context = If(statementContext, ExpressionContext.Statement, ExpressionContext.Expression)
- _onLastLambdaLine = True
-
- Visit(node)
-
- If _liftedState.Statements.Count > 0 Then
- If _context = ExpressionContext.Expression Then
- Throw New NotSupportedException("Lifted expressions remaining at top-level in expression context")
- End If
- End If
-
- DebugAssert(_stack.Count = 1, "_parameterStack.Count = 1")
- DebugAssert(_stack.Peek().Variables.Count = 0, "_stack.Peek().Parameters.Count = 0")
- DebugAssert(_stack.Peek().VariableNames.Count = 0, "_stack.Peek().ParameterNames.Count = 0")
-
- Return Result
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function Translate(node As Expression) As GeneratedSyntaxNodes
- Visit(node)
- Return Result
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function Translate(Of T As VisualBasicSyntaxNode)(node As Expression) As T
- Visit(node)
-
- Dim x = TryCast(Result.Node, T)
-
- If x Is Nothing Then
- Throw New InvalidOperationException($"Got translated node of type '{If(Result?.GetType().Name, "Nothing")}' instead of the expected {GetType(T)}.")
- End If
-
- Return x
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function Translate(expression As Expression, lowerableAssignmentVariable As IdentifierNameSyntax) As ExpressionSyntax
- DebugAssert(_context = ExpressionContext.Expression OrElse _context = ExpressionContext.ExpressionLambda,
- "Cannot lower in statement context")
-
- Dim switchExpression = TryCast(expression, SwitchExpression)
- If switchExpression IsNot Nothing Then Return DirectCast(TranslateSwitch(switchExpression, lowerableAssignmentVariable).Node, ExpressionSyntax)
-
- Dim conditionalExpression = TryCast(expression, ConditionalExpression)
- If conditionalExpression IsNot Nothing Then Return DirectCast(TranslateConditional(conditionalExpression, lowerableAssignmentVariable).Node, ExpressionSyntax)
-
- Return Translate(Of ExpressionSyntax)(expression)
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overrides Function Visit(node As Expression) As Expression
- If node Is Nothing Then
- Result = Nothing
- Return Nothing
- End If
-
- Return MyBase.Visit(node)
- End Function
-
- '''
- Protected Overrides Function VisitBinary(binary As BinaryExpression) As Expression
- Using ChangeContext(ExpressionContext.Expression)
-
- ' Handle special cases
-
- If IsVBStringComparisonOperators(binary) Then
- Dim opSyntaxKinds = GetSyntaxKindForBinaryOperator(binary)
-
- Result = New GeneratedSyntaxNodes(
- SF.BinaryExpression(
- opSyntaxKinds.Kind,
- Translate(Of ExpressionSyntax)(
- DirectCast(binary.Left, MethodCallExpression).Arguments(0)),
- SF.Token(opSyntaxKinds.OperatorTokenKind),
- Translate(Of ExpressionSyntax)(
- DirectCast(binary.Left, MethodCallExpression).Arguments(1))))
-
- Return binary
- End If
-
- Select Case binary.NodeType
- Case ExpressionType.Assign
- Return VisitAssignment(binary)
-
- Case ExpressionType.ModuloAssign
- Return VisitAssignment(
- E.Assign(
- binary.Left,
- E.Modulo(binary.Left, binary.Right)))
-
- Case ExpressionType.AndAssign
- Return VisitAssignment(
- E.Assign(
- binary.Left,
- E.And(binary.Left, binary.Right)))
-
- Case ExpressionType.OrAssign
- Return VisitAssignment(
- E.Assign(
- binary.Left,
- E.Or(binary.Left, binary.Right)))
-
- Case ExpressionType.ExclusiveOrAssign
- Return VisitAssignment(
- E.Assign(
- binary.Left,
- E.ExclusiveOr(binary.Left, binary.Right)))
-
- Case ExpressionType.Coalesce
- Return VisitCoalesce(binary)
- End Select
-
- Dim liftedStatementOrigPosition = _liftedState.Statements.Count
- Dim left = Translate(Of ExpressionSyntax)(binary.Left)
- Dim liftedStatementLeftPosition = _liftedState.Statements.Count
- Dim right = Translate(Of ExpressionSyntax)(binary.Right)
-
- ' If both sides were lifted, we don't need to do anything special. Same if the left side was lifted.
- ' But if the right side was lifted And the left wasn't, then in order to preserve evaluation order we need to lift the left side
- ' out as well, otherwise the right side gets evaluated before the left.
- ' We refrain from doing this only if the two expressions can't possibly have side effects over each other, for nicer code.
- If _liftedState.Statements.Count > liftedStatementLeftPosition AndAlso
- liftedStatementLeftPosition = liftedStatementOrigPosition AndAlso
- Not _sideEffectDetector.CanBeReordered(left, right) Then
-
- Dim name = UniquifyVariableName("lifted")
- _liftedState.Statements.Insert(
- liftedStatementLeftPosition,
- GenerateDeclaration(name, left))
- _liftedState.VariableNames.Add(name)
- left = SF.IdentifierName(name)
- End If
-
- If binary.NodeType = ExpressionType.ArrayIndex Then
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- left,
- SF.ArgumentList(SF.SingletonSeparatedList(Of ArgumentSyntax)(SF.SimpleArgument(right)))))
- Return binary
- End If
-
- Select Case binary.NodeType
- Case ExpressionType.Equal
- Result = TranslateEqual(binary, left, right)
- Return binary
-
- Case ExpressionType.NotEqual
- Result = TranslateNotEqual(binary, left, right)
- Return binary
- End Select
-
- ' TODO: Confirm what to do with the unchecked expression types
-
- Dim operatorSyntaxKinds = GetSyntaxKindForBinaryOperator(binary)
-
- If operatorSyntaxKinds.IsAnAssignmentStatement Then
- Result = New GeneratedSyntaxNodes(
- SF.AssignmentStatement(
- operatorSyntaxKinds.Kind,
- left,
- SF.Token(operatorSyntaxKinds.OperatorTokenKind),
- right))
- Else
- Result = New GeneratedSyntaxNodes(
- SF.BinaryExpression(
- operatorSyntaxKinds.Kind,
- left,
- SF.Token(operatorSyntaxKinds.OperatorTokenKind),
- right))
- End If
-
- Return binary
- End Using
- End Function
-
- Private Shared Function GetSyntaxKindForBinaryOperator(binary As BinaryExpression) _
- As (Kind As SyntaxKind,
- OperatorTokenKind As SyntaxKind,
- IsAnAssignmentStatement As Boolean)
-
- Select Case binary.NodeType
- Case ExpressionType.Equal
- Return (SyntaxKind.EqualsExpression, SyntaxKind.EqualsToken, False)
-
- Case ExpressionType.NotEqual
- Return (SyntaxKind.NotEqualsExpression, SyntaxKind.LessThanGreaterThanToken, False)
-
- Case ExpressionType.Add
- Return (SyntaxKind.AddExpression, SyntaxKind.PlusToken, False)
-
- Case ExpressionType.AddChecked
- Return (SyntaxKind.AddExpression, SyntaxKind.PlusToken, False)
-
- Case ExpressionType.Subtract
- Return (SyntaxKind.SubtractExpression, SyntaxKind.MinusToken, False)
-
- Case ExpressionType.SubtractChecked
- Return (SyntaxKind.SubtractExpression, SyntaxKind.MinusToken, False)
-
- Case ExpressionType.Multiply
- Return (SyntaxKind.MultiplyExpression, SyntaxKind.AsteriskToken, False)
-
- Case ExpressionType.MultiplyChecked
- Return (SyntaxKind.MultiplyExpression, SyntaxKind.AsteriskToken, False)
-
- Case ExpressionType.Divide
- Return (SyntaxKind.DivideExpression, SyntaxKind.SlashToken, False)
-
- Case ExpressionType.Modulo
- Return (SyntaxKind.ModuloExpression, SyntaxKind.ModKeyword, False)
-
- Case ExpressionType.Power
- Return (SyntaxKind.ExponentiateExpression, SyntaxKind.CaretToken, False)
-
- Case ExpressionType.AddAssign
- Return (SyntaxKind.AddAssignmentStatement, SyntaxKind.PlusEqualsToken, True)
-
- Case ExpressionType.AddAssignChecked
- Return (SyntaxKind.AddAssignmentStatement, SyntaxKind.PlusEqualsToken, True)
-
- Case ExpressionType.SubtractAssign
- Return (SyntaxKind.SubtractAssignmentStatement, SyntaxKind.MinusEqualsToken, True)
-
- Case ExpressionType.SubtractAssignChecked
- Return (SyntaxKind.SubtractAssignmentStatement, SyntaxKind.MinusEqualsToken, True)
-
- Case ExpressionType.MultiplyAssign
- Return (SyntaxKind.MultiplyAssignmentStatement, SyntaxKind.AsteriskEqualsToken, True)
-
- Case ExpressionType.MultiplyAssignChecked
- Return (SyntaxKind.MultiplyAssignmentStatement, SyntaxKind.AsteriskEqualsToken, True)
-
- Case ExpressionType.DivideAssign
- Return (SyntaxKind.DivideAssignmentStatement, SyntaxKind.SlashEqualsToken, True)
-
- Case ExpressionType.PowerAssign
- Return (SyntaxKind.ExponentiateAssignmentStatement, SyntaxKind.CaretEqualsToken, True)
-
- Case ExpressionType.GreaterThan
- Return (SyntaxKind.GreaterThanExpression, SyntaxKind.GreaterThanToken, False)
-
- Case ExpressionType.GreaterThanOrEqual
- Return (SyntaxKind.GreaterThanOrEqualExpression, SyntaxKind.GreaterThanEqualsToken, False)
-
- Case ExpressionType.LessThan
- Return (SyntaxKind.LessThanExpression, SyntaxKind.LessThanToken, False)
-
- Case ExpressionType.LessThanOrEqual
- Return (SyntaxKind.LessThanOrEqualExpression, SyntaxKind.LessThanEqualsToken, False)
-
- Case ExpressionType.AndAlso
- Return (SyntaxKind.AndAlsoExpression, SyntaxKind.AndAlsoKeyword, False)
-
- Case ExpressionType.OrElse
- Return (SyntaxKind.OrElseExpression, SyntaxKind.OrElseKeyword, False)
-
- Case ExpressionType.And
- Return (SyntaxKind.AndExpression, SyntaxKind.AndKeyword, False)
-
- Case ExpressionType.Or
- Return (SyntaxKind.OrExpression, SyntaxKind.OrKeyword, False)
-
- Case ExpressionType.ExclusiveOr
- Return (SyntaxKind.ExclusiveOrExpression, SyntaxKind.XorKeyword, False)
-
- Case ExpressionType.LeftShift
- Return (SyntaxKind.LeftShiftExpression, SyntaxKind.LessThanLessThanToken, False)
-
- Case ExpressionType.RightShift
- Return (SyntaxKind.RightShiftExpression, SyntaxKind.GreaterThanGreaterThanToken, False)
-
- Case ExpressionType.LeftShiftAssign
- Return (SyntaxKind.LeftShiftAssignmentStatement, SyntaxKind.LessThanLessThanEqualsToken, True)
-
- Case ExpressionType.RightShiftAssign
- Return (SyntaxKind.RightShiftAssignmentStatement, SyntaxKind.GreaterThanGreaterThanEqualsToken, True)
-
- Case Else
- Throw New ArgumentOutOfRangeException("BinaryExpression with " & binary.NodeType)
- End Select
- End Function
-
- Private Shared Function TranslateEqual(binary As BinaryExpression, left As ExpressionSyntax, right As ExpressionSyntax) As GeneratedSyntaxNodes
- If IsNullableValueTypeTestedWithNothing(binary) Then
- Return New GeneratedSyntaxNodes(
- SF.IsExpression(left, right))
- End If
-
- If Not IsReferenceEqualitySemantics(binary.Left, binary.Right) AndAlso
- (binary.Method?.Name = "op_Equality" OrElse binary.Left.Type.IsValueType) Then
-
- Return New GeneratedSyntaxNodes(
- SF.EqualsExpression(left, right))
- End If
-
- Return New GeneratedSyntaxNodes(
- SF.IsExpression(left, right))
- End Function
-
- Private Shared Function TranslateNotEqual(binary As BinaryExpression, left As ExpressionSyntax, right As ExpressionSyntax) As GeneratedSyntaxNodes
- If IsNullableValueTypeTestedWithNothing(binary) Then
- Return New GeneratedSyntaxNodes(
- SF.IsNotExpression(left, right))
- End If
-
- If Not IsReferenceEqualitySemantics(binary.Left, binary.Right) AndAlso
- (binary.Method?.Name = "op_Inequality" OrElse binary.Left.Type.IsValueType) Then
-
- Return New GeneratedSyntaxNodes(
- SF.NotEqualsExpression(left, right))
- End If
-
- Return New GeneratedSyntaxNodes(
- SF.IsNotExpression(left, right))
- End Function
-
- Private Shared Function IsNullableValueTypeTestedWithNothing(binary As BinaryExpression) As Boolean
- Return (binary.Left.Type.IsNullableValueType AndAlso
- binary.Right.NodeType = ExpressionType.Constant AndAlso
- DirectCast(binary.Right, ConstantExpression).Value Is Nothing) _
- OrElse
- (binary.Right.Type.IsNullableValueType AndAlso
- binary.Left.NodeType = ExpressionType.Constant AndAlso
- DirectCast(binary.Left, ConstantExpression).Value Is Nothing)
- End Function
-
- Private Function VisitAssignment(assignment As BinaryExpression) As Expression
-
- Dim translatedLeft = Translate(Of ExpressionSyntax)(assignment.Left)
-
- Dim translatedRight As ExpressionSyntax
-
- ' LINQ expression trees can directly access private members, but VB code cannot.
- ' If a private member Is being set, VisitMember generated a reflection GetValue invocation for it; detect
- ' that here And replace it with SetValue instead.
- ' TODO: Replace this With a more efficient API For .NET 8.0.
- ' TODO: Private Property
-
- Dim isPrivateMember = False
-
- Dim invocationExpressionSyntax = TryCast(translatedLeft, InvocationExpressionSyntax)
- If invocationExpressionSyntax IsNot Nothing AndAlso
- invocationExpressionSyntax.Expression IsNot Nothing Then
-
- Dim fieldInfoExpression As ExpressionSyntax = Nothing
-
- Dim memberAccessExpressionSyntax = TryCast(invocationExpressionSyntax.Expression, MemberAccessExpressionSyntax)
- If memberAccessExpressionSyntax IsNot Nothing AndAlso
- memberAccessExpressionSyntax.Name.Identifier.Text = NameOf(FieldInfo.GetValue) Then
-
- fieldInfoExpression = memberAccessExpressionSyntax.Expression
- isPrivateMember = True
- Dim lValue = invocationExpressionSyntax.ArgumentList?.Arguments(0)
-
- translatedRight = Translate(Of ExpressionSyntax)(assignment.Right)
-
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- SF.SimpleMemberAccessExpression(
- fieldInfoExpression,
- SF.IdentifierName(NameOf(FieldInfo.SetValue))),
- SF.ArgumentList(
- SF.SeparatedList({lValue, SF.SimpleArgument(translatedRight)}))))
- End If
- End If
-
- If Not isPrivateMember Then
- ' Identify assignment where the RHS supports assignment lowering (switch, conditional). If the e.g. switch expression Is
- ' lifted out (because some arm contains a block), this will lower the variable to be assigned inside the resulting switch
- ' statement, rather then adding another useless temporary variable.
- translatedRight = Translate(assignment.Right,
- lowerableAssignmentVariable:=TryCast(translatedLeft, IdentifierNameSyntax))
-
- ' If the RHS was lifted out And the assignment lowering succeeded, Translate above returns the lowered assignment variable;
- ' this would mean that we return a useless identity assignment (i = i). Instead, just return it.
- If translatedRight Is translatedLeft Then
- Result = New GeneratedSyntaxNodes(translatedRight)
- Else
- Result = New GeneratedSyntaxNodes(
- SF.SimpleAssignmentStatement(translatedLeft, translatedRight))
- End If
- End If
-
- Return assignment
- End Function
-
- Private Function VisitCoalesce(coalesxeExpr As BinaryExpression) As Expression
-
- If coalesxeExpr.Conversion IsNot Nothing Then Throw New NotSupportedException("Coalesce BinaryExpression with a conversion lambda.")
-
- Dim translatedLeft = Translate(Of ExpressionSyntax)(coalesxeExpr.Left)
- Dim translatedRight = Translate(Of ExpressionSyntax)(coalesxeExpr.Right)
-
- Result = New GeneratedSyntaxNodes(
- SF.BinaryConditionalExpression(translatedLeft, translatedRight))
-
- Return coalesxeExpr
- End Function
-
- Private Shared Function IsVBStringComparisonOperators(binary As BinaryExpression) As Boolean
- ' VB CODE x = y
- ' -> Equal(Microsoft.VisualBasic.CompilerServices.Operators.CompareString(x, y, False), 0)
-
- Dim methodExpr As MethodCallExpression
-
- Dim HaveAConstantZero = (binary.Left.NodeType = ExpressionType.Constant AndAlso DirectCast(binary.Left, ConstantExpression).Value?.Equals(0)) Xor
- (binary.Right.NodeType = ExpressionType.Constant AndAlso DirectCast(binary.Right, ConstantExpression).Value?.Equals(0))
-
- If HaveAConstantZero AndAlso
- (TypeOf binary.Left Is MethodCallExpression Xor
- TypeOf binary.Right Is MethodCallExpression) Then
-
- methodExpr = If(TryCast(binary.Left, MethodCallExpression),
- TryCast(binary.Right, MethodCallExpression))
- Else
- Return False
- End If
-
- Return methodExpr.Method.Name = "CompareString" AndAlso
- methodExpr.Method.DeclaringType?.Name = "Operators" AndAlso
- methodExpr.Method.DeclaringType?.Namespace = "Microsoft.VisualBasic.CompilerServices" AndAlso
- methodExpr.Object Is Nothing AndAlso
- methodExpr.Arguments.Count = 3 AndAlso
- TypeOf methodExpr.Arguments(2) Is ConstantExpression
- End Function
-
- '''
- Protected Overrides Function VisitBlock(block As BlockExpression) As Expression
- Dim blockContext = _context
-
- Dim parentOnLastLambdaLine = _onLastLambdaLine
- Dim parentLiftedState = _liftedState
-
- ' Expression blocks have no stack of their own, since they're lifted directly to their parent non-expression block.
- Dim ownStackFrame As StackFrame = Nothing
- If blockContext <> ExpressionContext.Expression Then
- ownStackFrame = PushNewStackFrame()
- _liftedState = LiftedState.CreateEmpty()
- End If
-
- Dim stackFrame = _stack.Peek()
-
- ' Do a 1st pass to identify And register any labels, since GoTo can appear before its label.
- PreprocessLabels(block)
-
- Try
- ' Go over the block's variables, assign names to any unnamed ones and uniquify. Then add them to our stack frame, unless
- ' this Is an expression block that will get lifted.
-
- For Each parameterExpr In block.Variables
- Dim variables = stackFrame.Variables
- Dim variableNames = stackFrame.VariableNames
-
- Dim uniquifiedName = UniquifyVariableName(If(parameterExpr.Name, "unnamed"))
-
- If blockContext = ExpressionContext.Expression Then
- _liftedState.Variables.Add(parameterExpr, uniquifiedName)
- _liftedState.VariableNames.Add(uniquifiedName)
- Else
- variables.Add(parameterExpr, uniquifiedName)
- variableNames.Add(uniquifiedName)
- End If
- Next
-
- Dim unassignedVariables = block.Variables.ToList()
-
- Dim statements As New List(Of SyntaxNode)()
-
- ' Now visit the block's expressions
- For i = 0 To block.Expressions.Count - 1
- Dim expression = block.Expressions(i)
- Dim onLastBlockLine = i = block.Expressions.Count - 1
- _onLastLambdaLine = parentOnLastLambdaLine AndAlso onLastBlockLine
-
- ' Any lines before the last are evaluated in statement context (they aren't returned); the last line is evaluated in the
- ' context of the block as a whole. _context now refers to the statement's context, blockContext to the block's.
- Dim statementContext = If(onLastBlockLine, _context, ExpressionContext.Statement)
-
- Dim translated As GeneratedSyntaxNodes
- Using ChangeContext(statementContext)
- translated = Translate(expression)
- End Using
-
- ' Syntax optimization. This is an assignment of a block variable to some value. Render this as
- ' Dim x As =
- ' ... instead of:
- ' Dim x As
- ' x =
- ' ... except for expression context (i.e. on the last line), where we just return the value if needed.
- Dim binaryExpr = TryCast(expression, BinaryExpression)
- Dim lValue = TryCast(binaryExpr?.Left, ParameterExpression)
- Dim AssignmentExpr As AssignmentStatementSyntax = Nothing
-
- If translated.Count = 1 Then
- AssignmentExpr = TryCast(translated.Node, AssignmentStatementSyntax)
- End If
-
- If binaryExpr IsNot Nothing AndAlso binaryExpr.NodeType = ExpressionType.Assign AndAlso
- lValue IsNot Nothing AndAlso
- AssignmentExpr IsNot Nothing AndAlso
- statementContext = ExpressionContext.Statement AndAlso
- unassignedVariables.Remove(lValue) Then
-
- Dim valueSyntax = AssignmentExpr.Right
-
- translated = New GeneratedSyntaxNodes(
- _g.LocalDeclarationStatement(Translate(lValue.Type), LookupVariableName(lValue), valueSyntax))
- End If
-
- If statementContext = ExpressionContext.Expression Then
- ' We're on the last line of a block in expression context - the block is being lifted out.
- ' All statements before the last line (this one) have already been added to _liftedStatements, just return the last
- ' expression.
- DebugAssert(onLastBlockLine, "onLastBlockLine")
- Result = translated
- Exit For
- End If
-
- If blockContext <> ExpressionContext.Expression Then
- If _liftedState.Statements.Count > 0 Then
- ' If any expressions were lifted out of the current expression, flatten them into our own block, just before the
- ' expression from which they were lifted. Note that we don't do this in Expression context, since our own block is
- ' lifted out.
- statements.AddRange(_liftedState.Statements)
- _liftedState.Statements.Clear()
- End If
-
- ' Same for any variables being lifted out of the block; we add them to our own stack frame so that we can do proper
- ' variable name uniquification etc.
- If _liftedState.Variables.Count > 0 Then
- For Each kv In _liftedState.Variables
- Dim param = kv.Key
- Dim name = kv.Value
- stackFrame.Variables(param) = name
- stackFrame.VariableNames.Add(name)
- Next
-
- _liftedState.Variables.Clear()
- End If
- End If
-
- ' Skip useless expressions with no side effects in statement context (these can be the result of switch/conditional lifting
- ' with assignment lowering)
- If statementContext = ExpressionContext.Statement AndAlso Not _sideEffectDetector.MayHaveSideEffects(translated.Nodes) Then
- Continue For
- End If
-
- Dim statementsBlock As SyntaxList(Of StatementSyntax)
-
- If translated.Count > 0 AndAlso Not translated.IsASingleExpression Then
- statementsBlock = ResultAsStatementSyntaxList(translated)
-
- ElseIf Not translated.IsASingleExpression Then
- Throw New ArgumentOutOfRangeException()
-
- ElseIf _onLastLambdaLine AndAlso
- statementContext = ExpressionContext.ExpressionLambda Then
- ' If this is the last line in an expression lambda, wrap it in a return statement.
- statementsBlock = SF.List(Of StatementSyntax)(
- {SF.ReturnStatement(DirectCast(translated.Node, ExpressionSyntax))})
- Else
- statementsBlock = SF.List(ResultAsStatementSyntaxList(translated))
- End If
-
- If blockContext = ExpressionContext.Expression Then
- ' This block Is in expression context, And so will be lifted (we won't be returning a block).
- _liftedState.Statements.AddRange(statementsBlock)
- Else
- statements.AddRange(statementsBlock)
- End If
- Next
-
- ' Above we transform top-level assignments (i = 8) to declarations with initializers (Dim i = 8) those variables have
- ' already been taken care of and removed from the list.
- ' But there may still be variables that get assigned inside nested blocks Or other situations; prepare declarations for those
- ' And either add them to the block, Or lift them if we're an expression block.
- Dim unassignedVariableDeclarations =
- unassignedVariables.Select(
- Function(v) DirectCast(_g.LocalDeclarationStatement(Translate(v.Type), LookupVariableName(v)), LocalDeclarationStatementSyntax))
-
- If blockContext = ExpressionContext.Expression Then
- _liftedState.UnassignedVariableDeclarations.AddRange(unassignedVariableDeclarations)
- Else
- statements.InsertRange(0, unassignedVariableDeclarations.Concat(_liftedState.UnassignedVariableDeclarations))
- _liftedState.UnassignedVariableDeclarations.Clear()
-
- ' We're done. If the block is in an expression context, it needs to be lifted out; but not if it's in a lambda (in that
- ' case we just added return above).
- Result = New GeneratedSyntaxNodes(statements)
- End If
-
- Return block
- Finally
- _onLastLambdaLine = parentOnLastLambdaLine
- _liftedState = parentLiftedState
-
- If ownStackFrame IsNot Nothing Then
- Dim popped = _stack.Pop()
- DebugAssert(popped.Equals(ownStackFrame), "popped.Equals(ownStackFrame)")
- End If
- End Try
- End Function
-
- Private Sub PreprocessLabels(block As BlockExpression)
-
- ' LINQ label targets can be unnamed, so we need to generate names for unnamed ones and maintain a target->name mapping.
- For Each labelExpr In block.Expressions.OfType(Of LabelExpression)()
-
- Dim identifier As String = Nothing
- If _labels.TryGetValue(labelExpr.Target, identifier) Then
- Continue For
- End If
-
- Dim labels = _labels
- Dim unnamedLabelNames = _unnamedLabelNames
-
- ' Generate names for unnamed label targets And uniquify
- identifier = If(labelExpr.Target.Name, "unnamedLabel")
- Dim identifierBase = identifier
-
- Dim i = 0
- While unnamedLabelNames.Contains(identifier)
- identifier = identifierBase & i
- i += 1
- End While
-
- If labelExpr.Target.Name Is Nothing Then
- unnamedLabelNames.Add(identifier)
- End If
-
- labels.Add(labelExpr.Target, identifier)
- Next
- End Sub
-
- '''
- Protected Overrides Function VisitCatchBlock(catchBlock As CatchBlock) As CatchBlock
- Result = New GeneratedSyntaxNodes(TranslateCatchBlock(catchBlock))
- Return catchBlock
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function TranslateCatchBlock(catchBlock As CatchBlock, Optional noType As Boolean = False) As SyntaxNode
- Dim translatedBody = Translate(catchBlock.Body)
-
- Dim identifier As IdentifierNameSyntax = Nothing
- Dim asClause As SimpleAsClauseSyntax = Nothing
-
- Dim exceptionTestType = If(noType, Nothing, catchBlock.Test)
-
- If exceptionTestType IsNot Nothing Then
- asClause = SF.SimpleAsClause(Translate(catchBlock.Test))
-
- If catchBlock.Variable IsNot Nothing Then
- If catchBlock.Variable.Name Is Nothing Then
- Throw New NotSupportedException("TranslateCatchBlock: unnamed parameter as catch variable")
- End If
-
- identifier = SF.IdentifierName(catchBlock.Variable.Name)
- Else
- Dim name = UniquifyVariableName(Nothing)
- identifier = SF.IdentifierName(name)
- End If
- End If
-
- DebugAssert(Not (asClause Is Nothing AndAlso catchBlock.Filter IsNot Nothing),
- "Not (asClause Is Nothing AndAlso catchBlock.Filter IsNot Nothing)")
-
- Dim whenClause = If(catchBlock.Filter Is Nothing, Nothing, SF.CatchFilterClause(Translate(Of ExpressionSyntax)(catchBlock.Filter)))
-
- Dim catchStatement = SF.CatchStatement(identifier, asClause, whenClause)
-
- Return SF.CatchBlock(catchStatement, ResultAsStatementSyntaxList(translatedBody))
- End Function
-
- '''
- Protected Overrides Function VisitConditional(conditional As ConditionalExpression) As Expression
- Result = TranslateConditional(conditional, lowerableAssignmentVariable:=Nothing)
-
- Return conditional
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function TranslateConditional(conditional As ConditionalExpression,
- lowerableAssignmentVariable As IdentifierNameSyntax) As GeneratedSyntaxNodes
-
- ' ConditionalExpression can be an expression or an If/Else statement.
- Dim test = Translate(Of ExpressionSyntax)(conditional.Test)
-
- Dim defaultIfFalse = TryCast(conditional.IfFalse, DefaultExpression)
- Dim isFalseAbsent = defaultIfFalse IsNot Nothing AndAlso defaultIfFalse.Type = GetType(Void)
-
- Select Case _context
- Case ExpressionContext.Statement
- Return New GeneratedSyntaxNodes(TranslateConditionalStatement(conditional, isFalseAbsent, test))
-
- Case ExpressionContext.Expression,
- ExpressionContext.ExpressionLambda
-
- If isFalseAbsent Then
- Throw New NotSupportedException(
- $"Missing {NameOf(ConditionalExpression.IfFalse)} in {NameOf(ConditionalExpression)} in expression context")
- End If
-
- Dim parentLiftedState = _liftedState
- _liftedState = LiftedState.CreateEmpty()
-
- ' If we're in a lambda body, we try to translate as an expression if possible (i.e. no blocks in the True/False arms).
- Using ChangeContext(ExpressionContext.Expression)
- Dim ifTrue = Translate(conditional.IfTrue)
- Dim ifFalse = Translate(conditional.IfFalse)
-
- If Not ifTrue.IsASingleExpression OrElse
- Not ifFalse.IsASingleExpression Then
- Throw New InvalidOperationException("Trying to evaluate a non-expression condition in expression context")
- End If
-
- Dim ifTrueExpression = ifTrue.GetExpression()
- Dim ifFalseExpression = ifFalse.GetExpression()
-
- ' There were no lifted expressions inside either arm - we can translate directly to a VB ternary conditional expression
- If _liftedState.Statements.Count = 0 Then
- _liftedState = parentLiftedState
- Return New GeneratedSyntaxNodes(SF.TernaryConditionalExpression(test, ifTrueExpression, ifFalseExpression))
- End If
- End Using
-
- ' If we're in a lambda body and couldn't translate as a conditional expression, translate as an If/Else statement with
- ' return. Wrap the true/false sides in blocks to have "return" added.
- If _context = ExpressionContext.ExpressionLambda Then
- _liftedState = parentLiftedState
-
- Return New GeneratedSyntaxNodes(
- TranslateConditionalStatement(
- conditional.Update(conditional.Test,
- If(TypeOf conditional.IfTrue Is BlockExpression, conditional.IfTrue, E.Block(conditional.IfTrue)),
- If(TypeOf conditional.IfFalse Is BlockExpression, conditional.IfFalse, E.Block(conditional.IfFalse))),
- isFalseAbsent,
- test))
- End If
-
- ' We're in regular expression context, and there are lifted expressions inside one of the arms; we translate to an If/Else
- ' statement but lowering an assignment into both sides of the condition
- _liftedState = LiftedState.CreateEmpty()
-
- Dim assignmentVariable As IdentifierNameSyntax
- Dim loweredAssignmentVariableType As TypeSyntax = Nothing
-
- If lowerableAssignmentVariable Is Nothing Then
- Dim name = UniquifyVariableName("liftedConditional")
- Dim parameter = E.Parameter(conditional.Type, name)
- assignmentVariable = SF.IdentifierName(name)
- loweredAssignmentVariableType = Translate(parameter.Type)
- Else
- assignmentVariable = lowerableAssignmentVariable
- End If
-
- Dim iftruestatements = ResultAsStatementSyntaxList(ProcessArmBody(conditional.IfTrue, assignmentVariable))
- Dim iffalsestatements = ResultAsStatementSyntaxList(ProcessArmBody(conditional.IfFalse, assignmentVariable))
-
- _liftedState = parentLiftedState
-
- If lowerableAssignmentVariable Is Nothing Then
- _liftedState.Statements.Add(
- SF.LocalDeclarationStatement(
- SF.TokenList(SF.Token(SyntaxKind.DimKeyword)),
- SF.SeparatedList(
- {SF.VariableDeclarator(
- SF.SeparatedList(
- {SF.ModifiedIdentifier(assignmentVariable.Identifier.Text)}),
- Nothing,
- Nothing)})))
- End If
-
- _liftedState.Statements.Add(
- SF.MultiLineIfBlock(
- SF.IfStatement(SF.Token(SyntaxKind.IfKeyword), test, SF.Token(SyntaxKind.ThenKeyword)),
- iftruestatements,
- elseIfBlocks:=Nothing,
- elseBlock:=SF.ElseBlock(iffalsestatements)))
-
- Return New GeneratedSyntaxNodes(assignmentVariable)
- Case Else
- Throw New ArgumentOutOfRangeException()
- End Select
- End Function
-
- Private Function ProcessArmBody(body As Expression, assignmentVariable As IdentifierNameSyntax) As GeneratedSyntaxNodes
- DebugAssert(_liftedState.Statements.Count = 0, "_liftedExpressions.Count = 0")
-
- Dim translatedBody = Translate(body, assignmentVariable)
-
- ' Usually we add an assignment for the variable.
- ' The exception Is if the body was itself lifted out And the assignment lowering succeeded (nested conditionals) -
- ' in this case we get back the lowered assignment variable, And don't need the assignment (i = i)
- If translatedBody IsNot assignmentVariable Then
- _liftedState.Statements.Add(
- SF.SimpleAssignmentStatement(
- assignmentVariable,
- translatedBody))
- End If
-
- Dim sn = New GeneratedSyntaxNodes(_liftedState.Statements.Cast(Of SyntaxNode))
-
- _liftedState.Statements.Clear()
- Return sn
- End Function
-
- Private Function TranslateConditionalStatement(conditional As ConditionalExpression,
- isFalseAbsent As Boolean,
- test As ExpressionSyntax) As MultiLineIfBlockSyntax
-
- Dim ifStatement = SF.IfStatement(SF.Token(SyntaxKind.IfKeyword), test, SF.Token(SyntaxKind.ThenKeyword))
- Dim ifTrue = Translate(conditional.IfTrue)
- Dim ifFalse = Translate(conditional.IfFalse)
-
- Dim ifTrueStatements = ResultAsStatementSyntaxList(ifTrue)
-
- If isFalseAbsent Then
- Return SF.MultiLineIfBlock(ifStatement, ifTrueStatements, Nothing, Nothing)
- End If
-
- Dim ifFalseStatements = ResultAsStatementSyntaxList(ifFalse)
-
- Dim ifFalseIfBlockSyntax = TryCast(ifFalseStatements.FirstOrDefault, MultiLineIfBlockSyntax)
-
- ' We want to specifically exempt MultiLineIfBlockSyntax under the Else from being wrapped by a block,
- ' so as to get nice ElseIf syntax
- If ifFalseStatements.Count = 1 AndAlso
- ifFalseIfBlockSyntax IsNot Nothing Then
-
- Dim elseIfBlocks = SF.List(Of ElseIfBlockSyntax)(
- {SF.ElseIfBlock(SF.ElseIfStatement(ifFalseIfBlockSyntax.IfStatement.Condition),
- ifFalseIfBlockSyntax.Statements)}.
- Concat(
- ifFalseIfBlockSyntax.ElseIfBlocks.Select(
- Function(b) SF.ElseIfBlock(SF.ElseIfStatement(b.ElseIfStatement.Condition),
- b.Statements))))
-
- Return SF.MultiLineIfBlock(ifStatement,
- ifTrueStatements,
- elseIfBlocks:=elseIfBlocks,
- elseBlock:=ifFalseIfBlockSyntax.ElseBlock)
- Else
- Return SF.MultiLineIfBlock(ifStatement,
- ifTrueStatements,
- elseIfBlocks:=Nothing,
- elseBlock:=SF.ElseBlock(ifFalseStatements))
- End If
- End Function
-
- '''
- Protected Overrides Function VisitConstant(constant As ConstantExpression) As Expression
- Result = New GeneratedSyntaxNodes(GenerateValue(constant.Value))
-
- Return constant
- End Function
-
- Private Function GenerateValue(value As Object) As ExpressionSyntax
-
- If TypeOf value Is Integer OrElse
- TypeOf value Is Long OrElse
- TypeOf value Is UInteger OrElse
- TypeOf value Is ULong OrElse
- TypeOf value Is Short OrElse
- TypeOf value Is SByte OrElse
- TypeOf value Is UShort OrElse
- TypeOf value Is Byte OrElse
- TypeOf value Is Double OrElse
- TypeOf value Is Single OrElse
- TypeOf value Is Decimal OrElse
- TypeOf value Is Char Then
-
- Return DirectCast(_g.LiteralExpression(value), ExpressionSyntax)
- End If
-
- If TypeOf value Is String OrElse
- TypeOf value Is Boolean OrElse
- value Is Nothing Then
-
- Return DirectCast(_g.LiteralExpression(value), ExpressionSyntax)
- End If
-
- Dim t = TryCast(value, Type)
- If t IsNot Nothing Then
- Return SF.GetTypeExpression(Translate(t))
- End If
-
- Dim en = TryCast(value, [Enum])
- If en IsNot Nothing Then
- Return HandleEnum(en)
- End If
-
- Dim tuple = TryCast(value, ITuple)
- If tuple IsNot Nothing Then
- Dim tupleType = tuple.GetType
- If tupleType.IsGenericType AndAlso
- tupleType.Name.StartsWith("ValueTuple`", StringComparison.Ordinal) AndAlso
- tupleType.Namespace = "System" Then
-
- Return HandleValueTuple(tuple)
- End If
- End If
-
- Dim c = TryCast(value, IEqualityComparer)
- If c IsNot Nothing AndAlso
- c Is StructuralComparisons.StructuralEqualityComparer Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(StructuralComparisons)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(StructuralComparisons.StructuralEqualityComparer)))
- End If
-
- Dim cultureInfo = TryCast(value, CultureInfo)
- If cultureInfo IsNot Nothing Then
- If cultureInfo Is CultureInfo.InvariantCulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.InvariantCulture)))
- End If
-
- If cultureInfo Is CultureInfo.InstalledUICulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.InstalledUICulture)))
- End If
-
- If cultureInfo Is CultureInfo.CurrentCulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.CurrentCulture)))
- End If
-
- If cultureInfo Is CultureInfo.CurrentUICulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.CurrentUICulture)))
- End If
-
- If cultureInfo Is CultureInfo.DefaultThreadCurrentCulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.DefaultThreadCurrentCulture)))
- End If
-
- If cultureInfo Is CultureInfo.DefaultThreadCurrentUICulture Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(CultureInfo)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(cultureInfo.DefaultThreadCurrentUICulture)))
- End If
- End If
-
- Dim encoding = TryCast(value, Encoding)
- If encoding IsNot Nothing Then
- If encoding Is Encoding.ASCII Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.ASCII)))
- End If
-
- If encoding Is Encoding.Unicode Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.Unicode)))
- End If
-
- If encoding Is Encoding.BigEndianUnicode Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.BigEndianUnicode)))
- End If
-
- If encoding Is Encoding.UTF8 Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.UTF8)))
- End If
-
- If encoding Is Encoding.UTF32 Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.UTF32)))
- End If
-
- If encoding Is Encoding.Latin1 Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.Latin1)))
- End If
-
- If encoding Is Encoding.Default Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- Translate(GetType(Encoding)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(NameOf(encoding.Default)))
- End If
- End If
-
- Throw New NotSupportedException(
- $"Encountered a constant of unsupported type '{value.GetType().Name}'. Only primitive constant nodes are supported.")
- End Function
-
- Private Function HandleValueTuple(tuple As ITuple) As ExpressionSyntax
- Dim arguments(tuple.Length - 1) As SimpleArgumentSyntax
- For i = 0 To tuple.Length - 1
- arguments(i) = SF.SimpleArgument(GenerateValue(tuple(i)))
- Next
-
- Return SF.TupleExpression(SF.SeparatedList(arguments))
- End Function
-
- Private Function HandleEnum(en As [Enum]) As ExpressionSyntax
- Dim enumType = en.GetType()
-
- Dim formatted = [Enum].Format(enumType, en, "G")
- If Char.IsDigit(formatted(0)) Then
- ' Unknown value, render as a cast of the underlying integral value
- If Not [Enum].IsDefined(en.GetType(), en) Then
- Dim underlyingType = enumType.GetEnumUnderlyingType()
-
- Return SF.CTypeExpression(
- SF.LiteralExpression(
- SyntaxKind.NumericLiteralExpression,
- If(underlyingType = GetType(SByte) OrElse
- underlyingType = GetType(Short) OrElse
- underlyingType = GetType(Integer) OrElse
- underlyingType = GetType(Long),
- SF.Literal(Long.Parse(formatted)),
- SF.Literal(ULong.Parse(formatted)))),
- Translate(enumType))
- End If
- End If
-
- Dim components = formatted.Split(", ")
- DebugAssert(components.Length > 0, "components.Length > 0")
-
- Return components.Aggregate(
- CType(Nothing, ExpressionSyntax),
- Function(last, [next])
- If last Is Nothing Then
- Return SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- SF.IdentifierName(enumType.Name),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName([next]))
- Else
- Return SyntaxFactory.BinaryExpression(
- SyntaxKind.OrExpression,
- last,
- SF.Token(SyntaxKind.OrKeyword),
- SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- SF.IdentifierName(enumType.Name),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName([next])))
- End If
- End Function)
- End Function
-
- '''
- Protected Overrides Function VisitDebugInfo(node As DebugInfoExpression) As Expression
- Throw New NotSupportedException("DebugInfo nodes are not supporting when translating expression trees to Visual Basic")
- End Function
-
- '''
- Protected Overrides Function VisitDefault(node As DefaultExpression) As Expression
- Result = New GeneratedSyntaxNodes(
- SF.CTypeExpression(SF.NothingLiteralExpression(SF.Token(SyntaxKind.NothingKeyword)), Translate(node.Type)))
- Return node
- End Function
-
- '''
- Protected Overrides Function VisitGoto(gotoNode As GotoExpression) As Expression
- Result = New GeneratedSyntaxNodes(
- SF.GoToStatement(SF.IdentifierLabel(TranslateLabelTarget(gotoNode.Target).Identifier)))
- Return gotoNode
- End Function
-
- '''
- Protected Overrides Function VisitInvocation(invocation As InvocationExpression) As Expression
- Dim lambda = DirectCast(invocation.Expression, LambdaExpression)
-
- ' We need to inline the lambda invocation into the tree, by replacing parameters in the lambda body with the invocation arguments.
- ' However, if an argument to the invocation can have side effects (e.g. a method call), and it's referenced multiple times from
- ' the body, then that would cause multiple evaluation, which is wrong (same if the arguments are evaluated only once but in reverse
- ' order).
- ' So we have to lift such arguments.
- Dim arguments(invocation.Arguments.Count - 1) As Expression
-
- For i = 0 To arguments.Length - 1
- Dim argument = invocation.Arguments(i)
-
- If TypeOf argument Is ConstantExpression Then
- ' No need to evaluate into a separate variable, just pass directly
- arguments(i) = argument
- Continue For
- End If
-
- ' Need to lift
- Dim name = UniquifyVariableName(If(lambda.Parameters(i).Name, "lifted"))
- Dim parameter = E.Parameter(argument.Type, name)
- _liftedState.Statements.Add(GenerateDeclaration(name, Translate(Of ExpressionSyntax)(argument)))
- arguments(i) = parameter
- Next
-
- Dim replacedBody = New ReplacingExpressionVisitor(lambda.Parameters, arguments).Visit(lambda.Body)
- Result = Translate(replacedBody)
-
- Return invocation
- End Function
-
- '''
- Protected Overrides Function VisitLabel(label As LabelExpression) As Expression
- Result = New GeneratedSyntaxNodes(
- SF.LabelStatement(TranslateLabelTarget(label.Target).Identifier.Text))
- Return label
- End Function
-
- '''
- Protected Overrides Function VisitLabelTarget(labelTarget As LabelTarget) As LabelTarget
- If labelTarget Is Nothing Then
- Throw New NotImplementedException("Null argument in VisitLabelTarget")
- End If
-
- Result = New GeneratedSyntaxNodes(TranslateLabelTarget(labelTarget))
- Return labelTarget
- End Function
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Protected Overridable Function TranslateLabelTarget(labelTarget As LabelTarget) As IdentifierNameSyntax
- ' In LINQ expression trees, label targets can have a return type (they're expressions), which means they return the last evaluated
- ' thing if e.g. they're the last expression in a block. This would require lifting out the last evaluation before the goto/break,
- ' assigning it to a temporary variable, and adding a variable evaluation after the label.
- If labelTarget.Type <> GetType(Void) Then
- Throw New NotImplementedException("Non-void label target")
- End If
-
- ' We did a processing pass on the block's labels, so any labels should already be found in our label stack frame
- Return SF.IdentifierName(_labels(labelTarget))
- End Function
-
- Private Function Translate(type As Type) As TypeSyntax
- If type.IsGenericType Then
- Return SF.GenericName(
- SF.Identifier(type.Name.Substring(0, type.Name.IndexOf("`"c))),
- SF.TypeArgumentList(SF.SeparatedList(type.GenericTypeArguments.Select(AddressOf Translate))))
- End If
-
- If type = GetType(String) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.StringKeyword))
- End If
-
- If type = GetType(Boolean) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.BooleanKeyword))
- End If
-
- If type = GetType(Byte) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.ByteKeyword))
- End If
-
- If type = GetType(SByte) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.SByteKeyword))
- End If
-
- If type = GetType(Integer) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.IntegerKeyword))
- End If
-
- If type = GetType(UInteger) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.UIntegerKeyword))
- End If
-
- If type = GetType(Short) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.ShortKeyword))
- End If
-
- If type = GetType(UShort) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.UShortKeyword))
- End If
-
- If type = GetType(Long) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.LongKeyword))
- End If
-
- If type = GetType(ULong) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.ULongKeyword))
- End If
-
- If type = GetType(Single) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.SingleKeyword))
- End If
-
- If type = GetType(Double) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.DoubleKeyword))
- End If
-
- If type = GetType(Decimal) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.DecimalKeyword))
- End If
-
- If type = GetType(Char) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.CharKeyword))
- End If
-
- If type = GetType(Object) Then
- Return SF.PredefinedType(SF.Token(SyntaxKind.ObjectKeyword))
- End If
-
- If type.IsArray Then
- Return SF.ArrayType(Translate(type.GetElementType()))
- End If
-
- If type.IsNested Then
- Return SF.QualifiedName(
- DirectCast(Translate(type.DeclaringType), NameSyntax),
- SF.IdentifierName(type.Name))
- End If
-
- If type.Namespace IsNot Nothing Then
- _collectedNamespaces.Add(type.Namespace)
- End If
-
- Return SF.IdentifierName(type.Name)
- End Function
-
- '''
- Protected Overrides Function VisitLambda(Of T)(lambda As Expression(Of T)) As Expression
-
- Using ChangeContext(If(lambda.ReturnType = GetType(Void),
- ExpressionContext.Statement,
- ExpressionContext.ExpressionLambda))
-
- Dim parentOnLastLambdaLine = _onLastLambdaLine
- _onLastLambdaLine = True
-
- Dim stackFrame = PushNewStackFrame()
-
- For Each param In lambda.Parameters
- Dim name = UniquifyVariableName(param.Name)
- stackFrame.Variables(param) = name
- stackFrame.VariableNames.Add(name)
- Next
-
- Dim body = Translate(lambda.Body)
-
- ' If the lambda body was an expression that had lifted statements (e.g. some block in expression context),
- ' we need to insert those statements at the start
- If _liftedState.Statements.Count > 0 Then
- DebugAssert(lambda.ReturnType <> GetType(Void), "lambda.ReturnType <> GetType(Void)")
- DebugAssert(body.IsASingleExpression, "body.IsASingleExpression")
-
- body = New GeneratedSyntaxNodes(
- _liftedState.Statements.
- Append(SF.ReturnStatement(body.GetExpression)).
- ToList())
-
- _liftedState.Statements.Clear()
- End If
-
- ' Note that we always explicitly include the parameters types.
- ' This is because in some cases, the parameter isn't actually used in the lambda body, and the compiler can't infer its type.
- ' However, we can't do that when the type is anonymous.
- Dim parameters =
- SF.ParameterList(
- SF.SeparatedList(
- lambda.
- Parameters.
- Select(Function(p) SF.Parameter(
- Nothing,
- Nothing,
- SF.ModifiedIdentifier(SF.Identifier(LookupVariableName(p))),
- SF.SimpleAsClause(If(p.Type.IsAnonymousType(), Nothing, Translate(p.Type))),
- Nothing))))
-
- Dim isSingleLine As Boolean
- Dim isProcedure = lambda.ReturnType = GetType(Void)
-
- Dim lambdaHeader As LambdaHeaderSyntax
- Dim lambdaKind As SyntaxKind
-
- If isProcedure Then
- ' The body of a single-line subroutine must be single-line statement.
- isSingleLine = body.Count = 1 AndAlso TypeOf body.Node Is InvocationExpressionSyntax
- lambdaHeader = SF.LambdaHeader(SyntaxKind.SubLambdaHeader, SF.Token(SyntaxKind.SubKeyword))
- lambdaKind = If(isSingleLine, SyntaxKind.SingleLineSubLambdaExpression, SyntaxKind.MultiLineSubLambdaExpression)
- Else
- Dim asClause As SimpleAsClauseSyntax = Nothing
- ' The body of a single-line function must be an expression that returns a value, not a statement.
- isSingleLine = body.IsASingleExpression OrElse
- (body.Count = 1 AndAlso TypeOf body.Node Is ReturnStatementSyntax)
-
- If Not isSingleLine Then
- asClause = SF.SimpleAsClause(Translate(lambda.ReturnType))
- End If
-
- lambdaHeader = SF.LambdaHeader(SyntaxKind.FunctionLambdaHeader, Nothing, Nothing, SF.Token(SyntaxKind.FunctionKeyword), Nothing, asClause)
- lambdaKind = If(isSingleLine, SyntaxKind.SingleLineFunctionLambdaExpression, SyntaxKind.MultiLineFunctionLambdaExpression)
- End If
-
- lambdaHeader = lambdaHeader.WithParameterList(parameters)
-
- If isSingleLine Then
- Result = New GeneratedSyntaxNodes(
- SF.SingleLineLambdaExpression(lambdaKind, lambdaHeader, DirectCast(body.Node, VisualBasicSyntaxNode)))
- Else
- Dim endStatement = If(isProcedure, SF.EndSubStatement(), SF.EndFunctionStatement())
- Dim statements = SF.List(ResultAsStatementSyntaxList(body))
-
- Result = New GeneratedSyntaxNodes(
- SF.MultiLineLambdaExpression(lambdaKind, lambdaHeader, statements, endStatement))
- End If
-
- Dim popped = _stack.Pop()
- DebugAssert(popped.Equals(stackFrame), "popped.Equals(stackFrame)")
-
- _onLastLambdaLine = parentOnLastLambdaLine
-
- Return lambda
- End Using
- End Function
-
- '''
- Protected Overrides Function VisitLoop([loop] As LoopExpression) As Expression
-
- If _context = ExpressionContext.Expression Then
- Throw New NotImplementedException()
- End If
-
- Dim rewrittenLoop1 = [loop]
-
- If [loop].ContinueLabel IsNot Nothing Then
- Dim blockExpr = TryCast([loop].Body, BlockExpression)
- Dim blockBody = If(blockExpr, E.Block([loop].Body))
-
- blockBody = blockBody.Update(
- blockBody.Variables,
- New E() {E.Label([loop].ContinueLabel)}.Concat(blockBody.Expressions))
-
- rewrittenLoop1 = [loop].Update(
- [loop].BreakLabel,
- continueLabel:=Nothing,
- blockBody)
- End If
-
- Dim rewrittenLoop2 As Expression = rewrittenLoop1
-
- If [loop].BreakLabel IsNot Nothing Then
- rewrittenLoop2 =
- E.Block(
- rewrittenLoop1.Update(breakLabel:=Nothing, rewrittenLoop1.ContinueLabel, rewrittenLoop1.Body),
- E.Label([loop].BreakLabel))
- End If
-
- If rewrittenLoop2 IsNot [loop] Then
- Return Visit(rewrittenLoop2)
- End If
-
- Dim translatedBody = ResultAsStatementSyntaxList(Translate([loop].Body))
-
- Result = New GeneratedSyntaxNodes(
- SF.WhileBlock(
- SF.WhileStatement(SF.TrueLiteralExpression(SF.Token(SyntaxKind.TrueKeyword))),
- translatedBody))
-
- Return [loop]
- End Function
-
- '''
- Protected Overrides Function VisitMember(member As MemberExpression) As Expression
- Using ChangeContext(ExpressionContext.Expression)
-
- ' LINQ expression trees can directly access private members, but VB code cannot; render (slow) reflection code that does the same
- ' thing. Note that assignment to private members is handled in VisitBinary.
- ' TODO: Replace this with a more efficient API for .NET 8.0.
-
- Dim fieldInfo = TryCast(member.Member, FieldInfo)
- If fieldInfo IsNot Nothing AndAlso fieldInfo.IsPrivate Then
- If member.Expression Is Nothing Then
- Throw New NotImplementedException("Private Shared field access")
- End If
-
- If member.Member.DeclaringType Is Nothing Then
- Throw New NotSupportedException("Private field without a declaring type: " & member.Member.Name)
- End If
-
- If _typeGetFieldMethod Is Nothing Then
- _typeGetFieldMethod = GetType(Type).GetMethod(NameOf(System.Type.GetField), {GetType(String), GetType(BindingFlags)})
- End If
-
- If _fieldGetValueMethod Is Nothing Then
- _fieldGetValueMethod = GetType(FieldInfo).GetMethod(NameOf(fieldInfo.GetValue), {GetType(Object)})
- End If
-
- Result = Translate(
- E.Call(
- E.Call(
- E.Constant(member.Member.DeclaringType),
- _typeGetFieldMethod,
- E.Constant(fieldInfo.Name),
- E.Constant(BindingFlags.NonPublic Or BindingFlags.Instance)),
- _fieldGetValueMethod,
- member.Expression))
-
- ' TODO: private property
- ' TODO: private event
-
- Return member
- End If
-
- Dim constantExpression = TryCast(member.Expression, ConstantExpression)
- If fieldInfo IsNot Nothing AndAlso constantExpression IsNot Nothing AndAlso
- constantExpression.Type.Attributes.HasFlag(TypeAttributes.NestedPrivate) AndAlso
- Attribute.IsDefined(constantExpression.Type, GetType(CompilerGeneratedAttribute), inherit:=True) Then
-
- ' Unwrap closure
- VisitConstant(E.Constant(fieldInfo.GetValue(constantExpression.Value), member.Type))
- Return member
- End If
-
- Result = New GeneratedSyntaxNodes(
- SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- If(member.Expression Is Nothing,
- Translate(member.Member.DeclaringType), ' Shared
- Translate(Of ExpressionSyntax)(member.Expression)),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(member.Member.Name)))
-
- Return member
- End Using
- End Function
-
- '''
- Protected Overrides Function VisitIndex(index As IndexExpression) As Expression
- Using ChangeContext(ExpressionContext.Expression)
-
- If index.Arguments.Count > 1 Then
- Throw New NotImplementedException("IndexExpression with multiple arguments")
- End If
-
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- Translate(Of ExpressionSyntax)(index.Object),
- SF.ArgumentList(
- SF.SingletonSeparatedList(Of ArgumentSyntax)(
- SF.SimpleArgument(
- Translate(Of ExpressionSyntax)(index.Arguments.Single()))))))
-
- Return index
- End Using
- End Function
-
- '''
- Protected Overrides Function VisitMethodCall([call] As MethodCallExpression) As Expression
-
- If [call].Method.DeclaringType Is Nothing Then
- Throw New NotSupportedException($"Can't translate method '{[call].Method.Name}' which has no declaring type")
- End If
-
- Using ChangeContext(ExpressionContext.Expression)
- Dim arguments = TranslateMethodArguments([call].Method.GetParameters(), [call].Arguments)
-
- ' For generic methods, we check whether the generic type arguments are inferrable (e.g. they all appear in the parameters), and
- ' only explicitly specify the arguments if not. Note that this isn't just for prettier code: anonymous types cannot be explicitly
- ' named in code.
- Dim methodIdentifier As SimpleNameSyntax
- If Not [call].Method.IsGenericMethod OrElse GenericTypeParameterAreInferrable([call]) Then
- methodIdentifier = SF.IdentifierName([call].Method.Name)
- Else
- DebugAssert(
- [call].Method.GetGenericArguments().All(Function(ga) Not ga.IsAnonymousType()),
- "Anonymous type as generic type argument for method whose type arguments aren't inferrable")
-
- methodIdentifier = SF.GenericName(
- SF.Identifier([call].Method.Name),
- SF.TypeArgumentList(
- SF.SeparatedList(
- [call].Method.GetGenericArguments().Select(AddressOf Translate))))
- End If
-
- ' Extension syntax
- Dim literal As LiteralExpressionSyntax = Nothing
- If arguments.Length > 0 Then literal = TryCast(arguments(0).Expression, LiteralExpressionSyntax)
-
- If [call].Method.IsDefined(GetType(ExtensionAttribute), inherit:=False) AndAlso
- Not (literal IsNot Nothing AndAlso
- literal.IsKind(SyntaxKind.NothingLiteralExpression)) Then
-
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- arguments(0).Expression,
- SF.Token(SyntaxKind.DotToken),
- methodIdentifier),
- SF.ArgumentList(SF.SeparatedList(arguments.Skip(1).Cast(Of ArgumentSyntax)))))
- ElseIf [call].Method.Name = "op_Equality" AndAlso
- [call].Method.IsHideBySig AndAlso
- [call].Method.IsSpecialName Then
-
- Result = New GeneratedSyntaxNodes(
- SF.EqualsExpression(
- Translate(Of ExpressionSyntax)([call].Arguments(0)),
- Translate(Of ExpressionSyntax)([call].Arguments(1))))
- Else
- Dim expression As ExpressionSyntax
- If [call].Object Is Nothing Then
- ' Shared method call. Recursively add MemberAccessExpressions for all declaring types (for methods on nested types)
- expression = GetMemberAccessesForAllDeclaringTypes([call].Method.DeclaringType)
- Else
- expression = Translate(Of ExpressionSyntax)([call].Object)
- End If
-
- If [call].Method.Name.StartsWith("get_", StringComparison.Ordinal) AndAlso
- [call].Method.GetParameters().Length = 1 AndAlso
- [call].Method.IsHideBySig AndAlso
- [call].Method.IsSpecialName Then
-
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- expression,
- SF.ArgumentList(SF.SeparatedList(arguments.Cast(Of ArgumentSyntax)))))
- Else
- Result = New GeneratedSyntaxNodes(
- SF.InvocationExpression(
- SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- expression,
- SF.Token(SyntaxKind.DotToken),
- methodIdentifier),
- SF.ArgumentList(SF.SeparatedList(arguments.Cast(Of ArgumentSyntax)))))
- End If
- End If
-
- If [call].Method.DeclaringType.Namespace <> "" Then
- _collectedNamespaces.Add([call].Method.DeclaringType.Namespace)
- End If
-
- Return [call]
- End Using
- End Function
-
- Private Function GetMemberAccessesForAllDeclaringTypes(type As Type) As ExpressionSyntax
- Return If(type.DeclaringType Is Nothing,
- DirectCast(Translate(type), ExpressionSyntax),
- SF.MemberAccessExpression(
- SyntaxKind.SimpleMemberAccessExpression,
- GetMemberAccessesForAllDeclaringTypes(type.DeclaringType),
- SF.Token(SyntaxKind.DotToken),
- SF.IdentifierName(type.Name)))
- End Function
-
- Private Function GenericTypeParameterAreInferrable([call] As MethodCallExpression) As Boolean
- Dim originalDefinition = [call].Method.GetGenericMethodDefinition()
- Dim unseenTypeParameters = originalDefinition.GetGenericArguments().ToList()
-
- For Each parameter In originalDefinition.GetParameters()
- ProcessType(parameter.ParameterType, unseenTypeParameters)
- Next
-
- Return unseenTypeParameters.Count = 0
- End Function
-
- Private Sub ProcessType(type As Type, unseenTypeParameters As List(Of Type))
- If type.IsGenericParameter Then
- unseenTypeParameters.Remove(type)
- ElseIf type.IsGenericType Then
- For Each genericArgument In type.GetGenericArguments()
- ProcessType(genericArgument, unseenTypeParameters)
- Next
- End If
- End Sub
-
- '''
- Protected Overrides Function VisitNewArray(newArray As NewArrayExpression) As Expression
- Using ChangeContext(ExpressionContext.Expression)
- Dim elementType = Translate(newArray.Type.GetElementType())
- Dim expressions = TranslateList(newArray.Expressions)
-
- If newArray.NodeType = ExpressionType.NewArrayBounds Then
- Result = New GeneratedSyntaxNodes(
- SF.ArrayCreationExpression(
- Nothing,
- elementType,
- GenerateArrayBounds(expressions),
- SF.CollectionInitializer()))
-
- Return newArray
- End If
-
- DebugAssert(newArray.NodeType = ExpressionType.NewArrayInit, "newArray.NodeType = ExpressionType.NewArrayInit")
-
- Result = New GeneratedSyntaxNodes(
- _g.ArrayCreationExpression(elementType, expressions))
-
- Return newArray
- End Using
- End Function
-
- Private Function GenerateArrayBounds(expressions As ExpressionSyntax()) As ArgumentListSyntax
-
- Dim arguments As New List(Of ArgumentSyntax)
-
- For Each expr In expressions
- arguments.Add(
- DirectCast(
- SF.SimpleArgument(
- SF.SubtractExpression(
- expr,
- SF.NumericLiteralExpression(
- SF.Literal(1)))),
- ArgumentSyntax))
- Next
-
- Return SF.ArgumentList(
- SF.SeparatedList(arguments))
- End Function
-
- '''
- Protected Overrides Function VisitNew(node As NewExpression) As Expression
- Using ChangeContext(ExpressionContext.Expression)
-
- Dim arguments = If(node.Constructor Is Nothing,
- Array.Empty(Of SimpleArgumentSyntax),
- TranslateMethodArguments(node.Constructor.GetParameters(), node.Arguments))
-
- If node.Type.IsAnonymousType() Then
- If node.Members Is Nothing Then
- Throw New NotSupportedException("Anonymous type creation without members")
- End If
-
- Result = New GeneratedSyntaxNodes(
- SF.AnonymousObjectCreationExpression(
- SF.ObjectMemberInitializer(
- SF.SeparatedList(Of FieldInitializerSyntax)(
- arguments.Select(Function(arg, i) SF.NamedFieldInitializer(SF.IdentifierName(node.Members(i).Name), arg.Expression))))))
-
- Return node
- End If
-
- ' If the type has any required properties and the constructor doesn't have [SetsRequiredMembers], we can't just generate an
- ' instantiation expression.
- ' TODO: Currently matching attributes by name since we target .NET 6.0. If/when we target .NET 7.0 and above, match the type.
- If node.Type.GetCustomAttributes(inherit:=True).
- Any(Function(a) a.GetType().FullName = "System.Runtime.CompilerServices.RequiredMemberAttribute") AndAlso
- node.Constructor IsNot Nothing AndAlso
- Not node.Constructor.GetCustomAttributes().
- Any(Function(a) a.GetType().FullName = "System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute") Then
-
- ' If the constructor is parameterless, we generate Activator.Create(Of T)() which is almost as fast (<10ns difference).
- ' For constructors with parameters, we currently throw as not supported (we can pass parameters, but boxing, probably
- ' speed degradation etc.).
- If node.Constructor.GetParameters().Length = 0 Then
-
- _activatorCreateInstanceMethod =
- If(_activatorCreateInstanceMethod, GetType(Activator).GetMethod(
- NameOf(Activator.CreateInstance), Array.Empty(Of Type)))
-
- Result =
- Translate(
- E.Call(_activatorCreateInstanceMethod.MakeGenericMethod(node.Type)))
- Else
- Throw New NotImplementedException("Instantiation of type with required properties via constructor that has parameters")
- End If
-
- Else
- ' Normal case with plain old instantiation
- Result = New GeneratedSyntaxNodes(
- SF.ObjectCreationExpression(
- Nothing,
- Translate(node.Type),
- SF.ArgumentList(SF.SeparatedList(Of ArgumentSyntax)(arguments)),
- Nothing))
- End If
-
- If node.Constructor?.DeclaringType?.Namespace IsNot Nothing Then
- _collectedNamespaces.Add(node.Constructor.DeclaringType.Namespace)
- End If
-
- Return node
- End Using
- End Function
-
- '''
- Protected Overrides Function VisitParameter(parameter As ParameterExpression) As Expression
-
- Dim name As String = Nothing
-
- ' Note that the parameter in the lambda declaration is handled separately in VisitLambda
- If _stack.Peek().Variables.TryGetValue(parameter, name) OrElse
- _liftedState.Variables.TryGetValue(parameter, name) Then
-
- Result = New GeneratedSyntaxNodes(SF.IdentifierName(name))
- Return parameter
- End If
-
- ' This parameter is unknown to us - it's captured from outside the entire expression tree.
- ' Simply return its name without worrying about uniquification, since the variable needs to correspond to the outside in any
- ' case (it's the callers responsibility).
- _capturedVariables.Add(parameter)
-
- If parameter.Name Is Nothing Then
- Throw New NotSupportedException("Unnamed captured variable")
- End If
-
- Result = New GeneratedSyntaxNodes(SF.IdentifierName(parameter.Name))
- Return parameter
- End Function
-
- '''
- Protected Overrides Function VisitRuntimeVariables(node As RuntimeVariablesExpression) As Expression
- Throw New NotSupportedException()
- End Function
-
- '''
- Protected Overrides Function VisitSwitchCase(node As SwitchCase) As SwitchCase
- Throw New NotSupportedException("Translation happens as part of VisitSwitch")
- End Function
-
- '''
- Protected Overrides Function VisitSwitch(switchNode As SwitchExpression) As Expression
- Result = TranslateSwitch(switchNode, lowerableAssignmentVariable:=Nothing)
-
- Return switchNode
- End Function
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Protected Overridable Function TranslateSwitch(switchNode As SwitchExpression, lowerableAssignmentVariable As IdentifierNameSyntax) As GeneratedSyntaxNodes
-
- If switchNode.Comparison IsNot Nothing Then
- Throw New NotImplementedException("Switch with non-null comparison method")
- End If
-
- Dim switchValue = Translate(Of ExpressionSyntax)(switchNode.SwitchValue)
-
- Select Case _context
- Case ExpressionContext.Statement
-
- ' Rewrites the switch as a series of nested ConditionalExpressions if a reference equality is found.
- If switchNode.Cases.SelectMany(Function(c) c.TestValues).Any(Function(tv) IsReferenceEqualitySemantics(switchNode.SwitchValue, tv)) Then
- Return TranslateConditional(RewriteSwitchToConditionals(switchNode), lowerableAssignmentVariable)
- End If
-
- Dim parentLiftedState = _liftedState
- _liftedState = LiftedState.CreateEmpty()
-
- Dim cases =
- SF.List(
- switchNode.Cases.Select(
- Function(c)
- Return SF.CaseBlock(
- SF.CaseStatement(
- SF.SeparatedList(Of CaseClauseSyntax)(
- c.TestValues.Select(
- Function(tv) SF.SimpleCaseClause(Translate(Of ExpressionSyntax)(tv))))),
- statements:=ProcessCaseBody(c.Body))
- End Function))
-
- If switchNode.DefaultBody IsNot Nothing Then
- cases = cases.Add(
- SF.CaseElseBlock(
- SF.CaseElseStatement(SF.ElseCaseClause()),
- ProcessCaseBody(switchNode.DefaultBody)))
- End If
-
- Return New GeneratedSyntaxNodes(SF.SelectBlock(SF.SelectStatement(switchValue), cases))
- Case ExpressionContext.Expression,
- ExpressionContext.ExpressionLambda
-
- If switchNode.DefaultBody Is Nothing Then
- Throw New NotSupportedException("Missing default arm for switch expression")
- End If
-
- Dim parentLiftedState = _liftedState
- _liftedState = LiftedState.CreateEmpty()
-
- ' VB does not support SwitchExpression. This rewrites the switch as a series of nested ConditionalExpressions.
- Dim conditionalExpr = TranslateConditional(RewriteSwitchToConditionals(switchNode), lowerableAssignmentVariable)
-
- ' If there were no lifted expressions inside any arm, we can return this TernaryConditionalExpression
- If _liftedState.Statements.Count = 0 AndAlso
- conditionalExpr.IsASingleExpression Then
- _liftedState = parentLiftedState
- Return conditionalExpr
- End If
-
- ' Rewriting it to a Select Case statement.
- _liftedState = LiftedState.CreateEmpty()
-
- Dim assignmentVariable As IdentifierNameSyntax
- Dim loweredAssignmentVariableType As TypeSyntax = Nothing
-
- If lowerableAssignmentVariable Is Nothing Then
- Dim name = UniquifyVariableName("liftedSwitch")
- Dim param = E.Parameter(switchNode.Type, name)
- assignmentVariable = SF.IdentifierName(name)
- loweredAssignmentVariableType = Translate(param.Type)
- Else
- assignmentVariable = lowerableAssignmentVariable
- End If
-
- Dim cases = SF.List(
- switchNode.Cases.Select(
- Function(c)
- Return SF.CaseBlock(
- SF.CaseStatement(
- SF.SeparatedList(Of CaseClauseSyntax)(
- c.TestValues.Select(
- Function(tv) SF.SimpleCaseClause(Translate(Of ExpressionSyntax)(tv))))),
- statements:=ProcessCaseArmBody(c.Body, assignmentVariable))
- End Function).
- Append(
- SF.CaseElseBlock(
- SF.CaseElseStatement(SF.ElseCaseClause()),
- ProcessCaseArmBody(switchNode.DefaultBody, assignmentVariable))))
-
- _liftedState = parentLiftedState
-
- If lowerableAssignmentVariable Is Nothing Then
- _liftedState.Statements.Add(
- SF.LocalDeclarationStatement(
- New SyntaxTokenList(SF.Token(SyntaxKind.DimKeyword)),
- SF.SingletonSeparatedList(
- SF.VariableDeclarator(
- SF.SingletonSeparatedList(SF.ModifiedIdentifier(assignmentVariable.Identifier.Text)),
- SF.SimpleAsClause(loweredAssignmentVariableType),
- Nothing))))
- End If
-
- _liftedState.Statements.Add(SF.SelectBlock(SF.SelectStatement(switchValue), cases))
- Return New GeneratedSyntaxNodes(assignmentVariable)
- Case Else
- Throw New ArgumentOutOfRangeException()
- End Select
- End Function
-
- Private Function ProcessCaseBody(body As Expression) As SyntaxList(Of StatementSyntax)
- Dim translatedBody = Translate(body)
-
- Return ResultAsStatementSyntaxList(translatedBody)
- End Function
-
- Private Function ProcessCaseArmBody(body As Expression, assignmentVariable As IdentifierNameSyntax) As SyntaxList(Of StatementSyntax)
- DebugAssert(_liftedState.Statements.Count = 0, "_liftedExpressions.Count = 0")
-
- Dim translatedBody = Translate(body, assignmentVariable)
-
- Dim AssignmentStatement = SF.SimpleAssignmentStatement(
- assignmentVariable,
- translatedBody)
-
- If _liftedState.Statements.Count = 0 Then
- ' Simple expression, can embed directly in the switch case
- Return SF.List(Of StatementSyntax)({AssignmentStatement})
- End If
-
- ' Usually we add an assignment for the variable.
- ' The exception is if the body was itself lifted out and the assignment lowering succeeded (nested conditionals) -
- ' in this case we get back the lowered assignment variable, and don't need the assignment (i = i)
- If translatedBody IsNot assignmentVariable Then
- _liftedState.Statements.Add(
- SF.SimpleAssignmentStatement(
- assignmentVariable,
- translatedBody))
- End If
-
- Dim statements = SF.List(_liftedState.Statements.ToList())
-
- _liftedState.Statements.Clear()
- Return statements
- End Function
-
- Private Shared Function RewriteSwitchToConditionals(node As SwitchExpression) As ConditionalExpression
- If node.Type = GetType(Void) Then
- Dim newExpr =
- node.Cases.
- SelectMany(Function(c) c.TestValues, Function(c, tv) New With {c.Body, .Label = tv}).
- Reverse().
- Aggregate(
- node.DefaultBody,
- Function(expression, arm) If(expression Is Nothing,
- E.IfThen(E.Equal(node.SwitchValue, arm.Label), arm.Body),
- E.IfThenElse(E.Equal(node.SwitchValue, arm.Label), arm.Body, expression)))
-
- If newExpr Is Nothing Then
- Throw New NotImplementedException("Empty switch statement")
- End If
-
- Return DirectCast(newExpr, ConditionalExpression)
- End If
-
- DebugAssert(node.DefaultBody IsNot Nothing, "Switch expression with non-void return type but no default body")
-
- Return DirectCast(
- node.Cases.
- SelectMany(Function(c) c.TestValues, Function(c, tv) New With {c.Body, .Label = tv}).
- Reverse().
- Aggregate(
- node.DefaultBody,
- Function(expression, arm) E.Condition(
- E.Equal(node.SwitchValue, arm.Label),
- arm.Body,
- expression)),
- ConditionalExpression)
- End Function
-
- '''
- Protected Overrides Function VisitTry(tryNode As TryExpression) As Expression
-
- Dim translatedBody As IEnumerable(Of SyntaxNode) = Translate(tryNode.Body).Nodes
-
- Dim translatedFinally As IEnumerable(Of SyntaxNode) = Nothing
-
- If tryNode.Finally IsNot Nothing Then
- translatedFinally = Translate(tryNode.Finally).Nodes
- End If
-
- Select Case _context
- Case ExpressionContext.Statement
- If tryNode.Fault IsNot Nothing Then
- DebugAssert(
- tryNode.Finally Is Nothing AndAlso tryNode.Handlers.Count = 0,
- "tryNode.Finally is nothing AndAlso tryNode.Handlers.Count = 0")
-
- Result = New GeneratedSyntaxNodes(
- _g.TryCatchStatement(
- translatedBody,
- catchClauses:={TranslateCatchBlock(E.Catch(GetType(Exception), tryNode.Fault), noType:=True)}))
-
- Return tryNode
- End If
-
- Result = New GeneratedSyntaxNodes(
- _g.TryCatchStatement(
- translatedBody,
- catchClauses:=tryNode.Handlers.Select(Function(h) TranslateCatchBlock(h)),
- translatedFinally))
-
- Return tryNode
-
- Case ExpressionContext.Expression,
- ExpressionContext.ExpressionLambda
-
- Throw New NotImplementedException()
- Case Else
- Throw New ArgumentOutOfRangeException()
- End Select
- End Function
-
- '''
- Protected Overrides Function VisitTypeBinary(node As TypeBinaryExpression) As Expression
- Dim visitedExpression = Translate(Of ExpressionSyntax)(node.Expression)
-
- Select Case node.NodeType
- Case ExpressionType.TypeIs
- Result = New GeneratedSyntaxNodes(
- SF.TypeOfIsExpression(visitedExpression, Translate(node.TypeOperand)))
- Case ExpressionType.TypeEqual
- Result = New GeneratedSyntaxNodes(
- SF.EqualsExpression(SF.InvocationExpression(SF.SimpleMemberAccessExpression(visitedExpression, SF.IdentifierName(NameOf(Object.GetType))), SF.ArgumentList()),
- SF.GetTypeExpression(Translate(node.TypeOperand))))
- Case Else : Throw New ArgumentOutOfRangeException()
- End Select
-
- Return node
- End Function
-
- '''
- Protected Overrides Function VisitUnary(unary As UnaryExpression) As Expression
-
- If unary.Method IsNot Nothing AndAlso
- Not unary.Method.IsHideBySig AndAlso
- Not unary.Method.IsSpecialName AndAlso
- unary.Method.Name <> "op_Implicit" AndAlso
- unary.Method.Name <> "op_Explicit" AndAlso
- Not isVBTypeConversionFunctions(unary) Then
-
- Throw New NotImplementedException("Unary node with non-null method")
- End If
-
- Using ChangeContext(ExpressionContext.Expression)
- Dim operand = Translate(Of ExpressionSyntax)(unary.Operand)
-
- ' TODO: Confirm what to do with the unchecked expression types
-
- If unary.NodeType = ExpressionType.Not AndAlso unary.Type = GetType(Boolean) Then
- Result = New GeneratedSyntaxNodes(_g.LogicalNotExpression(operand))
- ElseIf unary.NodeType = ExpressionType.Throw AndAlso unary.Type = GetType(Void) Then
- Result = New GeneratedSyntaxNodes(_g.ThrowStatement(operand))
- Else
- Select Case unary.NodeType
- Case ExpressionType.Negate
- Result = New GeneratedSyntaxNodes(_g.NegateExpression(operand))
- Case ExpressionType.NegateChecked
- Result = New GeneratedSyntaxNodes(_g.NegateExpression(operand))
- Case ExpressionType.Not
- Result = New GeneratedSyntaxNodes(_g.BitwiseNotExpression(operand))
- Case ExpressionType.OnesComplement
- Result = New GeneratedSyntaxNodes(_g.BitwiseNotExpression(operand))
- Case ExpressionType.IsFalse
- Result = New GeneratedSyntaxNodes(_g.LogicalNotExpression(operand))
- Case ExpressionType.IsTrue
- Result = New GeneratedSyntaxNodes(operand)
- Case ExpressionType.ArrayLength
- Result = New GeneratedSyntaxNodes(_g.MemberAccessExpression(operand, "Length"))
- Case ExpressionType.Convert
- Result = TranslateConvert(unary, operand)
- Case ExpressionType.ConvertChecked
- Result = TranslateConvert(unary, operand)
- Case ExpressionType.Throw
- Result = New GeneratedSyntaxNodes(_g.ThrowExpression(operand))
- Case ExpressionType.TypeAs
- Result = TranslateTypeAs(unary, operand)
- Case ExpressionType.Quote
- Result = New GeneratedSyntaxNodes(operand)
- Case ExpressionType.UnaryPlus
- Result = New GeneratedSyntaxNodes(SF.UnaryPlusExpression(operand))
- Case ExpressionType.Unbox
- Result = New GeneratedSyntaxNodes(operand)
- Case ExpressionType.Increment
- Result = Translate(E.Add(unary.Operand, E.Constant(1)))
- Case ExpressionType.Decrement
- Result = Translate(E.Subtract(unary.Operand, E.Constant(1)))
- Case ExpressionType.PostIncrementAssign,
- ExpressionType.PostDecrementAssign,
- ExpressionType.PreIncrementAssign,
- ExpressionType.PreDecrementAssign
- Throw New NotSupportedException("Unsupported LINQ unary node: " & unary.NodeType.ToString())
- Case Else
- Throw New ArgumentOutOfRangeException("Unsupported LINQ unary node: " & unary.NodeType.ToString())
- End Select
- End If
-
- Return unary
- End Using
- End Function
-
- Private Function TranslateTypeAs(unary As UnaryExpression, operand As ExpressionSyntax) As GeneratedSyntaxNodes
- If unary.Type.IsNullableValueType Then
- Dim underlyingType = unary.Type.UnwrapNullableType()
- Return New GeneratedSyntaxNodes(
- SF.TernaryConditionalExpression(
- SF.TypeOfIsExpression(operand, Translate(underlyingType)),
- SF.CTypeExpression(operand, Translate(underlyingType)),
- SF.ObjectCreationExpression(Translate(unary.Type))))
- End If
-
- Return New GeneratedSyntaxNodes(SF.TryCastExpression(operand, Translate(unary.Type)))
- End Function
-
- Private Function TranslateConvert(unary As UnaryExpression, operand As ExpressionSyntax) As GeneratedSyntaxNodes
-
- If unary.Type Is GetType(Integer) AndAlso
- unary.Operand.Type Is GetType(Char) Then
-
- If _AscW Is Nothing Then
- _AscW = GetType(Strings).GetMethod(NameOf(Microsoft.VisualBasic.AscW), {GetType(Char)})
- End If
-
- Return Translate(E.Call(_AscW, unary.Operand))
- End If
-
- If unary.Type Is GetType(Char) AndAlso
- unary.Operand.Type Is GetType(Integer) Then
-
- If _ChrW Is Nothing Then
- _ChrW = GetType(Strings).GetMethod(NameOf(Microsoft.VisualBasic.ChrW), {GetType(Integer)})
- End If
-
- Return Translate(E.Call(_ChrW, unary.Operand))
- End If
-
- If isVBTypeConversionFunctions(unary) Then
- Return New GeneratedSyntaxNodes(
- SF.PredefinedCastExpression(
- VBTypeConversionFunctions(unary.Method.DeclaringType.FullName & "." & unary.Method.Name),
- operand).
- WithAdditionalAnnotations(Simplification.Simplifier.Annotation))
- End If
-
- Return New GeneratedSyntaxNodes(
- SF.CTypeExpression(operand, Translate(unary.Type)).
- WithAdditionalAnnotations(Simplification.Simplifier.Annotation))
- End Function
-
- Private Shared ReadOnly VBTypeConversionFunctions As New Dictionary(Of String, SyntaxToken)(StringComparer.Ordinal) From {
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean", SF.Token(SyntaxKind.CBoolKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToByte", SF.Token(SyntaxKind.CByteKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToChar", SF.Token(SyntaxKind.CCharKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToDate", SF.Token(SyntaxKind.CDateKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble", SF.Token(SyntaxKind.CDblKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal", SF.Token(SyntaxKind.CDecKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger", SF.Token(SyntaxKind.CIntKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToLong", SF.Token(SyntaxKind.CLngKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToObject", SF.Token(SyntaxKind.CObjKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte", SF.Token(SyntaxKind.CSByteKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToShort", SF.Token(SyntaxKind.CShortKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle", SF.Token(SyntaxKind.CSngKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToString", SF.Token(SyntaxKind.CStrKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger", SF.Token(SyntaxKind.CUIntKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToULong", SF.Token(SyntaxKind.CULngKeyword)},
- {"Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort", SF.Token(SyntaxKind.CUShortKeyword)}
- }
-
- Private Shared Function isVBTypeConversionFunctions(unary As UnaryExpression) As Boolean
- If unary.Method Is Nothing Then Return False
-
- If unary.NodeType <> ExpressionType.Convert AndAlso
- unary.NodeType <> ExpressionType.ConvertChecked Then
- Return False
- End If
-
- If VBTypeConversionFunctions.ContainsKey(unary.Method.DeclaringType.FullName & "." & unary.Method.Name) Then
- Return True
- End If
-
- Return False
- End Function
-
- '''
- Protected Overrides Function VisitMemberInit(memberInit As MemberInitExpression) As Expression
- Dim objectCreation = Translate(Of ObjectCreationExpressionSyntax)(memberInit.NewExpression)
-
- Dim incompatibleListBindings As List(Of MemberListBinding) = Nothing
-
- Dim initializerExpressions As New List(Of FieldInitializerSyntax)(memberInit.Bindings.Count)
-
- For Each binding In memberInit.Bindings
- ' VB collection initialization syntax only works when Add is called on an IEnumerable, but LINQ supports arbitrary add
- ' methods. Skip these, we'll add them later outside the initializer
-
- Dim listBinding = TryCast(binding, MemberListBinding)
- If listBinding IsNot Nothing AndAlso
- (Not GetMemberType(listBinding.Member).IsAssignableTo(GetType(IEnumerable)) OrElse
- listBinding.Initializers.Any(Function(e) e.AddMethod.Name <> "Add" OrElse
- e.Arguments.Count <> 1)) Then
-
- incompatibleListBindings = If(incompatibleListBindings, New List(Of MemberListBinding))
- incompatibleListBindings.Add(listBinding)
- Continue For
- End If
-
- Dim liftedStatementsPosition = _liftedState.Statements.Count
-
- VisitMemberBinding(binding)
-
- initializerExpressions.Add(DirectCast(Result.Node, FieldInitializerSyntax))
-
- If _liftedState.Statements.Count > liftedStatementsPosition Then
- ' TODO: This is tricky because of the recursive nature of MemberMemberBinding
- Throw New NotImplementedException("MemberInit: lifted statements")
- End If
- Next
-
- If incompatibleListBindings IsNot Nothing Then
- ' TODO: Lift the instantiation and add extra statements to add the incompatible bindings after that
- Throw New NotImplementedException("MemberInit: incompatible MemberListBinding")
- End If
-
- Result = New GeneratedSyntaxNodes(
- objectCreation.WithInitializer(
- SF.ObjectMemberInitializer(
- SF.SeparatedList(Of FieldInitializerSyntax)(initializerExpressions))))
-
- Return memberInit
- End Function
-
- Private Shared Function GetMemberType(memberInfo As MemberInfo) As Type
- Return If((TryCast(memberInfo, PropertyInfo))?.PropertyType, DirectCast(memberInfo, FieldInfo).FieldType)
- End Function
-
- '''
- Protected Overrides Function VisitListInit(listInit As ListInitExpression) As Expression
- Dim objectCreation = Translate(Of ObjectCreationExpressionSyntax)(listInit.NewExpression)
-
- Dim incompatibleListBindings As List(Of ElementInit) = Nothing
-
- Dim initializerExpressions As New List(Of ExpressionSyntax)(listInit.Initializers.Count)
-
- For Each initializer In listInit.Initializers
- ' VB collection initialization syntax only works when Add is called on an IEnumerable, but LINQ supports arbitrary add
- ' methods. Skip these, we'll add them later outside the initializer
- If Not listInit.NewExpression.Type.IsAssignableTo(GetType(IEnumerable)) OrElse
- listInit.Initializers.Any(Function(e) e.AddMethod.Name <> "Add" OrElse
- e.Arguments.Count <> 1) Then
- incompatibleListBindings = If(incompatibleListBindings, New List(Of ElementInit))
- incompatibleListBindings.Add(initializer)
- Continue For
- End If
-
- Dim liftedStatementsPosition = _liftedState.Statements.Count
-
- VisitElementInit(initializer)
-
- initializerExpressions.Add(DirectCast(Result.Node, ExpressionSyntax))
-
- If _liftedState.Statements.Count > liftedStatementsPosition Then
- Throw New NotImplementedException("ListInit: lifted statements")
- End If
- Next
-
- If incompatibleListBindings IsNot Nothing Then
- ' TODO: This requires lifting statements to *after* the instantiation - we usually lift to before.
- ' This is problematic: if such an expression is passed as an argument to a method, there's no way to faithfully translate it
- ' while preserving evaluation order.
- Throw New NotImplementedException("ListInit: incompatible ElementInit")
- End If
-
- Result = New GeneratedSyntaxNodes(
- objectCreation.WithInitializer(
- SF.ObjectCollectionInitializer(
- SF.CollectionInitializer(SF.SeparatedList(initializerExpressions)))))
-
- Return listInit
- End Function
-
- '''
- Protected Overrides Function VisitElementInit(elementInit As ElementInit) As ElementInit
- DebugAssert(elementInit.Arguments.Count = 1, "elementInit.Arguments.Count = 1")
-
- Visit(elementInit.Arguments.Single())
-
- Return elementInit
- End Function
-
- '''
- Protected Overrides Function VisitMemberAssignment(memberAssignment As MemberAssignment) As MemberAssignment
- Result = New GeneratedSyntaxNodes(
- SF.NamedFieldInitializer(
- SF.IdentifierName(memberAssignment.Member.Name),
- Translate(Of ExpressionSyntax)(memberAssignment.Expression)))
-
- Return memberAssignment
- End Function
-
- '''
- Protected Overrides Function VisitMemberMemberBinding(memberMemberBinding As MemberMemberBinding) As MemberMemberBinding
-
- Dim underlyingType As Type
-
- Select Case memberMemberBinding.Member.MemberType
- Case MemberTypes.Field
- underlyingType = DirectCast(memberMemberBinding.Member, FieldInfo).FieldType
- Case MemberTypes.Property
- underlyingType = DirectCast(memberMemberBinding.Member, PropertyInfo).PropertyType
- Case Else
- Throw New NotSupportedException("Member in MemberMemberBinding must represent a field or property.")
- End Select
-
- Result = New GeneratedSyntaxNodes(
- SF.NamedFieldInitializer(
- SF.IdentifierName(memberMemberBinding.Member.Name),
- SF.ObjectCreationExpression(
- Nothing,
- Translate(underlyingType),
- Nothing,
- SF.ObjectMemberInitializer(
- SF.SeparatedList(Of FieldInitializerSyntax)(
- memberMemberBinding.Bindings.Select(
- Function(x)
- VisitMemberBinding(x)
- Return DirectCast(Result.Node, FieldInitializerSyntax)
- End Function))))))
-
- Return memberMemberBinding
- End Function
-
- '''
- Protected Overrides Function VisitMemberListBinding(memberListBinding As MemberListBinding) As MemberListBinding
-
- Dim underlyingType As Type
-
- Select Case memberListBinding.Member.MemberType
- Case MemberTypes.Field
- underlyingType = DirectCast(memberListBinding.Member, FieldInfo).FieldType
- Case MemberTypes.Property
- underlyingType = DirectCast(memberListBinding.Member, PropertyInfo).PropertyType
- Case Else
- Throw New NotSupportedException("Member in MemberListBinding must represent a field or property.")
- End Select
-
- Result = New GeneratedSyntaxNodes(
- SF.NamedFieldInitializer(
- SF.IdentifierName(memberListBinding.Member.Name),
- SF.ObjectCreationExpression(
- Nothing,
- Translate(underlyingType),
- Nothing,
- SF.ObjectCollectionInitializer(
- SF.CollectionInitializer(
- SF.SeparatedList(Of ExpressionSyntax)(
- memberListBinding.Initializers.Select(
- Function(i)
- VisitElementInit(i)
- Return DirectCast(Result.Node, ExpressionSyntax)
- End Function)))))))
-
- Return memberListBinding
- End Function
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Protected Overrides Function VisitExtension(node As Expression) As Expression
- ' TODO: Remove any EF-specific code from this visitor (extend if needed)
- ' TODO: Hack mode. Visit the expression beforehand to replace EntityQueryRootExpression with context.Set<>(), or receive it in this visitor as a replacement or something.
- Dim entityQueryRoot = TryCast(node, EntityQueryRootExpression)
- If entityQueryRoot IsNot Nothing Then
- ' TODO: STET
- Result = New GeneratedSyntaxNodes(
- SF.ParseExpression($"context.Set(Of {entityQueryRoot.EntityType.ClrType.Name})()"))
- Return node
- End If
-
- Throw New NotSupportedException(
- $"Encountered non-quotable expression of type {node.GetType()} when translating expression tree to VB")
- End Function
-
- Private Function TranslateMethodArguments(parameters As ParameterInfo(), arguments As IReadOnlyList(Of Expression)) As SimpleArgumentSyntax()
- Dim translatedExpressions = TranslateList(arguments)
- Dim translatedArguments(arguments.Count - 1) As SimpleArgumentSyntax
-
- For i = 0 To translatedExpressions.Length - 1
- Dim parameter = parameters(i)
- Dim argument = SF.SimpleArgument(translatedExpressions(i))
-
- translatedArguments(i) = argument
- Next
-
- Return translatedArguments
- End Function
-
- Private Function TranslateList(list As IReadOnlyList(Of Expression)) As ExpressionSyntax()
- DebugAssert(_context = ExpressionContext.Expression, "_context = ExpressionContext.Expression")
-
- Dim translatedList(list.Count - 1) As ExpressionSyntax
- Dim lastLiftedArgumentPosition = 0
-
- For i = 0 To list.Count - 1
-
- Dim expression = list(i)
-
- Dim liftedStatementsPosition = _liftedState.Statements.Count
-
- Dim translated = Translate(Of ExpressionSyntax)(expression)
-
- If _liftedState.Statements.Count > liftedStatementsPosition Then
- ' This argument contained lifted statements. In order to preserve evaluation order, we must also lift out all preceding
- ' arguments to before this argument's lifted statements.
- While lastLiftedArgumentPosition < i
-
- Dim argumentExpression = translatedList(lastLiftedArgumentPosition)
-
- If Not _sideEffectDetector.CanBeReordered(argumentExpression, translated) Then
- Dim name = UniquifyVariableName("liftedArg")
-
- _liftedState.Statements.Insert(
- liftedStatementsPosition,
- GenerateDeclaration(name, argumentExpression))
-
- liftedStatementsPosition += 1
-
- _liftedState.VariableNames.Add(name)
-
- translatedList(lastLiftedArgumentPosition) = SF.IdentifierName(name)
- End If
- lastLiftedArgumentPosition += 1
- End While
- End If
-
- translatedList(i) = translated
- Next
-
- Return translatedList
- End Function
-
- Private Function PushNewStackFrame() As StackFrame
- Dim previousFrame = _stack.Peek()
- Dim newFrame As New StackFrame(
- New Dictionary(Of ParameterExpression, String)(previousFrame.Variables),
- New HashSet(Of String)(previousFrame.VariableNames, StringComparer.OrdinalIgnoreCase))
-
- _stack.Push(newFrame)
-
- Return newFrame
- End Function
-
- Private Function LookupVariableName(parameter As ParameterExpression) As String
- Dim name As String = Nothing
-
- Return If(_stack.Peek().Variables.TryGetValue(parameter, name),
- name,
- _liftedState.Variables(parameter))
- End Function
-
- Private Function UniquifyVariableName(name As String) As String
- Dim isUnnamed = name Is Nothing
- name = If(name, "unnamed")
-
- Dim parameterNames = _stack.Peek().VariableNames
-
- If parameterNames.Contains(name) OrElse _liftedState.VariableNames.Contains(name) Then
- Dim baseName = name
- Dim j = If(isUnnamed, _unnamedParameterCounter, 0)
- _unnamedParameterCounter += 1
- While parameterNames.Contains(name) OrElse _liftedState.VariableNames.Contains(name)
- name = baseName & j
- j += 1
- End While
- End If
-
- Return name
- End Function
-
- Private Shared Function GenerateDeclaration(variableIdentifier As String, initializer As ExpressionSyntax) As LocalDeclarationStatementSyntax
-
- Return SF.LocalDeclarationStatement(
- New SyntaxTokenList(SF.Token(SyntaxKind.DimKeyword)),
- SF.SingletonSeparatedList(
- SF.VariableDeclarator(
- SF.SingletonSeparatedList(SF.ModifiedIdentifier(variableIdentifier)),
- Nothing,
- SF.EqualsValue(initializer))))
- End Function
-
- Private Function ChangeContext(newContext As ExpressionContext) As ContextChanger
- Return New ContextChanger(Me, newContext)
- End Function
-
- Private Structure ContextChanger
- Implements IDisposable
-
- Private ReadOnly _translator As LinqToVisualBasicSyntaxTranslator
- Private ReadOnly _oldContext As ExpressionContext
-
- Public Sub New(translator As LinqToVisualBasicSyntaxTranslator, newContext As ExpressionContext)
- _translator = translator
- _oldContext = translator._context
- translator._context = newContext
- End Sub
-
- Public Sub Dispose() Implements IDisposable.Dispose
- _translator._context = _oldContext
- End Sub
- End Structure
-
- Private Enum ExpressionContext
- Expression
- Statement
- ExpressionLambda
- End Enum
-
- Private NotInheritable Class SideEffectDetectionSyntaxWalker
- Inherits SyntaxWalker
-
- Private _mayHaveSideEffects As Boolean
-
- '''
- ''' Returns whether the two provided nodes can be re-ordered without the reversed evaluation order having any effect.
- ''' For example, two literal expressions can be safely ordered, while two invocations cannot.
- '''
- Public Function CanBeReordered(first As SyntaxNode, second As SyntaxNode) As Boolean
- Return TypeOf first Is LiteralExpressionSyntax OrElse (Not MayHaveSideEffects(first) AndAlso Not MayHaveSideEffects(second))
- End Function
-
- Public Function MayHaveSideEffects(node As SyntaxNode) As Boolean
- _mayHaveSideEffects = False
-
- Visit(node)
-
- Return _mayHaveSideEffects
- End Function
-
- Public Function MayHaveSideEffects(nodes As IList(Of SyntaxNode)) As Boolean
- _mayHaveSideEffects = False
-
- Dim i = 0
- While Not _mayHaveSideEffects AndAlso i < nodes.Count
- Dim node = nodes(i)
- Visit(node)
- i += 1
- End While
-
- Return _mayHaveSideEffects
- End Function
-
- Public Overrides Sub Visit(node As SyntaxNode)
- _mayHaveSideEffects = _mayHaveSideEffects OrElse MayHaveSideEffectsCore(node)
-
- MyBase.Visit(node)
- End Sub
-
- Private Shared Function MayHaveSideEffectsCore(node As SyntaxNode) As Boolean
-
- ' TODO: we can exempt most binary and unary expressions as well, e.g. i + 5, but not anything involving assignment
-
- Select Case True
- Case TypeOf node Is IdentifierNameSyntax,
- TypeOf node Is LiteralExpressionSyntax,
- TypeOf node Is EmptyStatementSyntax
- Return False
- Case Else
- Return True
- End Select
- End Function
- End Class
-
- Protected Class GeneratedSyntaxNodes
- Private _Nodes As List(Of SyntaxNode)
-
- Sub New()
- End Sub
-
- Sub New(sn As SyntaxNode)
- _Nodes = New List(Of SyntaxNode)({sn})
- End Sub
-
- Sub New(nodes As IEnumerable(Of SyntaxNode))
- _Nodes = New List(Of SyntaxNode)(nodes)
- End Sub
-
- Public Overridable Property Node As SyntaxNode
- Get
- If _Nodes Is Nothing OrElse _Nodes.Count = 0 Then Return Nothing
- DebugAssert(Count = 1, "GeneratedSyntaxNodes.Count <> 1")
- Return _Nodes.Last()
- End Get
- Set
- _Nodes = New List(Of SyntaxNode)({Value})
- End Set
- End Property
-
- Public Overridable Property Nodes As List(Of SyntaxNode)
- Get
- If _Nodes Is Nothing OrElse _Nodes.Count = 0 Then Return Nothing
- Return _Nodes
- End Get
- Set
- _Nodes = Value
- End Set
- End Property
-
- Public ReadOnly Property IsASingleExpression() As Boolean
- Get
- If Count <> 1 Then Return False
- Return TypeOf _Nodes.First Is ExpressionSyntax
- End Get
- End Property
-
- Public ReadOnly Property Count() As Integer
- Get
- Return _Nodes.Count
- End Get
- End Property
-
- Public Function GetExpression() As ExpressionSyntax
- Return TryCast(Node, ExpressionSyntax)
- End Function
- End Class
-
- Private Function ResultAsStatementSyntaxList(result As GeneratedSyntaxNodes) As SyntaxList(Of StatementSyntax)
- If result.Count = 0 Then Return SF.List(Of StatementSyntax)
-
- If result.Count > 1 Then
- Return SF.List(result.Nodes.Select(Function(x) CastAsStatementSyntax(x)))
- End If
-
- Return SF.List({CastAsStatementSyntax(result.Nodes.First())})
- End Function
-
- Private Function CastAsStatementSyntax(s As SyntaxNode) As StatementSyntax
-
- Dim ss = TryCast(s, StatementSyntax)
- If ss IsNot Nothing Then
- Return ss
- End If
-
- Dim es = TryCast(s, ExpressionSyntax)
- If es IsNot Nothing Then
- Select Case es.Kind()
- Case SyntaxKind.InvocationExpression
- Return SF.ExpressionStatement(es)
- Case Else
- Return DirectCast(_g.LocalDeclarationStatement(UniquifyVariableName(Nothing), es), LocalDeclarationStatementSyntax)
- End Select
- End If
-
- Throw New InvalidCastException($"Cannot convert a {s.GetType()} to a StatementSyntax.")
- End Function
-
- Private Shared Function IsReferenceEqualitySemantics(left As Expression, right As Expression) As Boolean
- If left.NodeType <> ExpressionType.Convert OrElse left.Type IsNot GetType(Object) Then
- Return False
- End If
-
- If right.NodeType <> ExpressionType.Convert OrElse right.Type IsNot GetType(Object) Then
- Return False
- End If
-
- Return True
- End Function
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index b932e8a..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,49 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Cosmos.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Class CosmosVisualBasicRuntimeAnnotationCodeGenerator
- Inherits VisualBasicRuntimeAnnotationCodeGenerator
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Sub New(vbHelper As IVisualBasicHelper)
- MyBase.New(vbHelper)
- End Sub
-
- '''
- Public Overrides Sub Generate(model As IModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If Not parameters.IsRuntime Then
- annotations.Remove(CosmosAnnotationNames.Throughput)
- End If
-
- MyBase.Generate(model, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(entityType As IEntityType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(CosmosAnnotationNames.AnalyticalStoreTimeToLive)
- .Remove(CosmosAnnotationNames.DefaultTimeToLive)
- .Remove(CosmosAnnotationNames.Throughput)
- End With
- End If
-
- MyBase.Generate(entityType, parameters)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicServices.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicServices.vb
deleted file mode 100644
index 6460347..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/CosmosVisualBasicServices.vb
+++ /dev/null
@@ -1,13 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.Extensions.DependencyInjection
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- Public Class CosmosVisualBasicServices
- Implements IDesignTimeServices
-
- Public Sub ConfigureDesignTimeServices(services As IServiceCollection) Implements IDesignTimeServices.ConfigureDesignTimeServices
- services.AddSingleton(Of IVisualBasicRuntimeAnnotationCodeGenerator, CosmosVisualBasicRuntimeAnnotationCodeGenerator)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index b8c28b1..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,21 +0,0 @@
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Class InMemoryVisualBasicRuntimeAnnotationCodeGenerator
- Inherits VisualBasicRuntimeAnnotationCodeGenerator
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Sub New(vbHelper As IVisualBasicHelper)
- MyBase.New(vbHelper)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicServices.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicServices.vb
deleted file mode 100644
index f198f16..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/InMemoryVisualBasicServices.vb
+++ /dev/null
@@ -1,13 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.Extensions.DependencyInjection
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- Public Class InMemoryVisualBasicServices
- Implements IDesignTimeServices
-
- Public Sub ConfigureDesignTimeServices(services As IServiceCollection) Implements IDesignTimeServices.ConfigureDesignTimeServices
- services.AddSingleton(Of IVisualBasicRuntimeAnnotationCodeGenerator, InMemoryVisualBasicRuntimeAnnotationCodeGenerator)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/RelationalVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/RelationalVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index a3d264d..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/RelationalVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,2557 +0,0 @@
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.Diagnostics
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Migrations
-Imports Microsoft.EntityFrameworkCore.Storage
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' Base class to be used by relational database providers when implementing an
- '''
- Public Class RelationalVisualBasicRuntimeAnnotationCodeGenerator
- Inherits VisualBasicRuntimeAnnotationCodeGenerator
-
- '''
- ''' Initializes a New instance of this class.
- '''
- ''' The Visual Basic helper.
- Public Sub New(vbHelper As IVisualBasicHelper)
- MyBase.New(vbHelper)
- End Sub
-
- '''
- Public Overrides Sub Generate(model As IModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim annotations = parameters.Annotations
- If parameters.IsRuntime Then
- annotations.Remove(RelationalAnnotationNames.ModelDependencies)
-
- Dim relationalModel As RelationalModel = Nothing
- If annotations.TryGetAndRemove(RelationalAnnotationNames.RelationalModel,
- relationalModel) Then
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.RelationalModel, "CreateRelationalModel()", parameters)
-
- Dim MethodBuilder As New IndentedStringBuilder()
- Create(
- relationalModel,
- parameters.Cloner.
- WithMainBuilder(parameters.MethodBuilder).
- WithMethodBuilder(MethodBuilder).
- WithScopeVariables(New HashSet(Of String)).
- Clone)
-
- Dim methods = MethodBuilder.ToString()
- If Not String.IsNullOrEmpty(methods) Then
- parameters.
- MethodBuilder.
- AppendLine().
- AppendLines(methods)
- End If
- End If
- Else
- annotations.Remove(RelationalAnnotationNames.Collation)
-
- Dim functions As SortedDictionary(Of String, IDbFunction) = Nothing
-
- If TryGetAndRemove(annotations, RelationalAnnotationNames.DbFunctions, functions) Then
- parameters.Namespaces.Add(GetType(SortedDictionary(Of,)).Namespace)
- parameters.Namespaces.Add(GetType(BindingFlags).Namespace)
- Dim functionsVariable = VBCode.Identifier("functions", parameters.ScopeVariables, capitalize:=False)
- parameters.
- MainBuilder.
- Append("Dim ").
- Append(functionsVariable).
- AppendLine(" As New SortedDictionary(Of String, IDbFunction)()")
-
- For Each func In functions.Values
- Create(func, functionsVariable, parameters)
- Next
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.DbFunctions, functionsVariable, parameters)
- End If
-
- Dim sequences As SortedDictionary(Of (String, String), ISequence) = Nothing
-
- If TryGetAndRemove(annotations, RelationalAnnotationNames.Sequences, sequences) Then
- parameters.Namespaces.Add(GetType(SortedDictionary(Of,)).Namespace)
- Dim sequencesVariable = VBCode.Identifier("sequences", parameters.ScopeVariables, capitalize:=False)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(sequencesVariable).
- AppendLine(" As New SortedDictionary(Of (String, String), ISequence)()")
-
- For Each sequencePair In sequences
- Create(sequencePair.Value, sequencesVariable, parameters)
- Next
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.Sequences, sequencesVariable, parameters)
- End If
- End If
-
- MyBase.Generate(model, parameters)
- End Sub
-
- Private Overloads Sub Create(model As IRelationalModel,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.AppendLine("Private Function CreateRelationalModel() As IRelationalModel")
-
- Using mainBuilder.Indent()
- parameters.Namespaces.Add(GetType(RelationalModel).Namespace)
- parameters.Namespaces.Add(GetType(Microsoft.EntityFrameworkCore.RelationalModelExtensions).Namespace)
- Dim relationalModelVariable = VBCode.Identifier("relationalModel", parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.AppendLine($"Dim {relationalModelVariable} As New RelationalModel({parameters.TargetName})")
-
- Dim metadataVariables = New Dictionary(Of IAnnotatable, String)()
-
- Dim relationalModelParameters = parameters.Cloner.
- WithTargetName(relationalModelVariable).
- Clone
-
- AddNamespace(GetType(List(Of TableMapping)), parameters.Namespaces)
-
- For Each entityType In model.Model.GetEntityTypes()
- CreateMappings(entityType, declaringVariable:=Nothing, metadataVariables, relationalModelParameters)
- Next
-
- For Each table In model.Tables
- For Each foreignKey In table.ForeignKeyConstraints
- Create(foreignKey, metadataVariables, parameters.Cloner.WithTargetName(metadataVariables(table)).Clone())
- Next
- Next
-
- For Each dbFunction In model.Model.GetDbFunctions()
- If Not dbFunction.IsScalar Then Continue For
- GetOrCreate(dbFunction.StoreFunction, metadataVariables, relationalModelParameters)
- Next
-
- CreateAnnotations(
- model,
- AddressOf Generate,
- relationalModelParameters)
-
- mainBuilder.
- AppendLine($"Return {relationalModelVariable}.MakeReadOnly()")
- End Using
-
- mainBuilder.
- AppendLine("End Function")
- End Sub
-
- Private Sub CreateMappings(typeBase As ITypeBase,
- declaringVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim mainBuilder = parameters.MainBuilder
-
- Dim typeBaseVariable = VBCode.Identifier(typeBase.ShortName(), parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(typeBase, typeBaseVariable)
- If TypeOf typeBase Is IComplexType Then
- Dim complexType = DirectCast(typeBase, IComplexType)
-
- mainBuilder.
- AppendLine().
- Append($"Dim {typeBaseVariable} = ").
- AppendLine($"{declaringVariable}.FindComplexProperty({VBCode.Literal(complexType.ComplexProperty.Name)}).ComplexType")
- Else
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {typeBaseVariable} = FindEntityType({VBCode.Literal(typeBase.Name)})")
- End If
-
- ' All the mappings below are added in a way that preserves the order
- For Each mapping In typeBase.GetDefaultMappings()
- Dim tableMappingsVariable = VBCode.Identifier("defaultTableMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {tableMappingsVariable} As New List(Of TableMappingBase(Of ColumnMappingBase))()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine($"{VBCode.Literal(RelationalAnnotationNames.DefaultMappings)}, {tableMappingsVariable})")
- Create(mapping, tableMappingsVariable, metadataVariables, parameters)
- Next
-
- If typeBase.GetTableMappings().Any() Then
- Dim tableMappingsVariable = VBCode.Identifier("tableMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {tableMappingsVariable} As New List(Of TableMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine($"{VBCode.Literal(RelationalAnnotationNames.TableMappings)}, {tableMappingsVariable})")
- For Each mapping In typeBase.GetTableMappings()
- Create(mapping, tableMappingsVariable, metadataVariables, parameters)
- Next
- End If
-
- If typeBase.GetViewMappings().Any() Then
- Dim viewMappingsVariable = VBCode.Identifier("viewMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {viewMappingsVariable} As New List(Of ViewMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine($"{VBCode.Literal(RelationalAnnotationNames.ViewMappings)}, {viewMappingsVariable})")
- For Each mapping In typeBase.GetViewMappings()
- Create(mapping, viewMappingsVariable, metadataVariables, parameters)
- Next
- End If
-
- If typeBase.GetSqlQueryMappings().Any() Then
- Dim sqlQueryMappingsVariable = VBCode.Identifier("sqlQueryMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {sqlQueryMappingsVariable} As New List(Of SqlQueryMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine($"{VBCode.Literal(RelationalAnnotationNames.SqlQueryMappings)}, {sqlQueryMappingsVariable})")
- For Each mapping In typeBase.GetSqlQueryMappings()
- Create(mapping, sqlQueryMappingsVariable, metadataVariables, parameters)
- Next
- End If
-
- If typeBase.GetFunctionMappings().Any() Then
- Dim functionMappingsVariable = VBCode.Identifier("functionMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {functionMappingsVariable} As New List(Of FunctionMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine($"{VBCode.Literal(RelationalAnnotationNames.FunctionMappings)}, {functionMappingsVariable})")
- For Each mapping In typeBase.GetFunctionMappings()
- Create(mapping, functionMappingsVariable, metadataVariables, parameters)
- Next
- End If
-
- If typeBase.GetDeleteStoredProcedureMappings().Any() Then
- Dim deleteSprocMappingsVariable = VBCode.Identifier("deleteSprocMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {deleteSprocMappingsVariable} As New List(Of StoredProcedureMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine(
- $"{VBCode.Literal(RelationalAnnotationNames.DeleteStoredProcedureMappings)}, {deleteSprocMappingsVariable})")
- For Each mapping In typeBase.GetDeleteStoredProcedureMappings()
- Create(
- mapping,
- deleteSprocMappingsVariable,
- StoreObjectType.DeleteStoredProcedure,
- metadataVariables,
- parameters)
- Next
- End If
-
- If typeBase.GetInsertStoredProcedureMappings().Any() Then
- Dim insertSprocMappingsVariable = VBCode.Identifier("insertSprocMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {insertSprocMappingsVariable} As New List(Of StoredProcedureMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine(
- $"{VBCode.Literal(RelationalAnnotationNames.InsertStoredProcedureMappings)}, {insertSprocMappingsVariable})")
- For Each mapping In typeBase.GetInsertStoredProcedureMappings()
- Create(
- mapping,
- insertSprocMappingsVariable,
- StoreObjectType.InsertStoredProcedure,
- metadataVariables,
- parameters)
- Next
- End If
-
- If typeBase.GetUpdateStoredProcedureMappings().Any() Then
- Dim updateSprocMappingsVariable = VBCode.Identifier("updateSprocMappings", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine().
- AppendLine($"Dim {updateSprocMappingsVariable} As New List(Of StoredProcedureMapping)()").
- Append($"{typeBaseVariable}.SetRuntimeAnnotation(").
- AppendLine(
- $"{VBCode.Literal(RelationalAnnotationNames.UpdateStoredProcedureMappings)}, {updateSprocMappingsVariable})")
- For Each mapping In typeBase.GetUpdateStoredProcedureMappings()
- Create(
- mapping,
- updateSprocMappingsVariable,
- StoreObjectType.UpdateStoredProcedure,
- metadataVariables,
- parameters)
- Next
- End If
-
- For Each complexProperty In typeBase.GetDeclaredComplexProperties()
- CreateMappings(complexProperty.ComplexType, typeBaseVariable, metadataVariables, parameters)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The relational model to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(model As IRelationalModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate(table As ITableBase,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim tableVariable As String = Nothing
- If metadataVariables.TryGetValue(table, tableVariable) Then
- Return tableVariable
- End If
-
- Dim code = VBCode
- tableVariable = code.Identifier(table.Name & "TableBase", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(table, tableVariable)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append($"Dim {tableVariable} As New TableBase({code.Literal(table.Name)}, {code.Literal(table.Schema)}, ").
- AppendLine($"{parameters.TargetName})")
-
- Dim tableParameters = parameters.Cloner.
- WithTargetName(tableVariable).
- Clone
-
- For Each column In table.Columns
- Create(column, metadataVariables, tableParameters)
- Next
-
- CreateAnnotations(
- table,
- AddressOf Generate,
- tableParameters)
-
- mainBuilder.
- AppendLine($"{parameters.TargetName}.DefaultTables.Add({code.Literal(table.Name)}, {tableVariable})")
-
- Return tableVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The table to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(table As ITableBase, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate(table As ITable,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim tableVariable As String = Nothing
- If metadataVariables.TryGetValue(table, tableVariable) Then
- Return tableVariable
- End If
-
- Dim code = VBCode
-
- tableVariable = code.Identifier(table.Name & "Table", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(table, tableVariable)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append($"Dim {tableVariable} As New Table({code.Literal(table.Name)}, {code.Literal(table.Schema)}, ").
- AppendLine($"{parameters.TargetName})")
-
- Dim tableParameters = parameters.Cloner.
- WithTargetName(tableVariable).
- Clone
-
- For Each column In table.Columns
- Create(column, metadataVariables, tableParameters)
- Next
-
- For Each uniqueConstraint In table.UniqueConstraints
- Create(uniqueConstraint, uniqueConstraint.Columns.Select(Function(c) metadataVariables(c)), tableParameters)
- Next
-
- For Each index In table.Indexes
- Create(index, index.Columns.Select(Function(c) metadataVariables(c)), tableParameters)
- Next
-
- For Each trigger In table.Triggers
- Dim entityTypeVariable = metadataVariables(trigger.EntityType)
-
- Dim triggerName = trigger.GetDatabaseName(StoreObjectIdentifier.Table(table.Name, table.Schema))
-
- mainBuilder.
- Append($"{tableVariable}.Triggers.Add({code.Literal(triggerName)}, ").
- AppendLine($"{entityTypeVariable}.FindDeclaredTrigger({code.Literal(trigger.ModelName)}))")
- Next
-
- CreateAnnotations(
- table,
- AddressOf Generate,
- tableParameters)
-
- mainBuilder.
- Append($"{parameters.TargetName}.Tables.Add((").
- AppendLine($"{code.Literal(table.Name)}, {code.Literal(table.Schema)}), {tableVariable})")
-
- Return tableVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The table to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(table As ITable, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate(view As IView,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim viewVariable As String = Nothing
- If metadataVariables.TryGetValue(view, viewVariable) Then
- Return viewVariable
- End If
-
- Dim code = VBCode
-
- viewVariable = code.Identifier(view.Name & "View", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(view, viewVariable)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append($"Dim {viewVariable} As New View({code.Literal(view.Name)}, {code.Literal(view.Schema)}, ").
- AppendLine($"{parameters.TargetName})")
-
- Dim viewParameters = parameters.Cloner.
- WithTargetName(viewVariable).
- Clone
-
- For Each column In view.Columns
- Create(column, metadataVariables, viewParameters)
- Next
-
- CreateAnnotations(
- view,
- AddressOf Generate,
- viewParameters)
-
- mainBuilder.
- Append($"{parameters.TargetName}.Views.Add((").
- AppendLine($"{code.Literal(view.Name)}, {code.Literal(view.Schema)}), {viewVariable})")
-
- Return viewVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The view to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(view As IView, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate(sqlQuery As ISqlQuery,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim sqlQueryVariable As String = Nothing
- If metadataVariables.TryGetValue(sqlQuery, sqlQueryVariable) Then
- Return sqlQueryVariable
- End If
-
- sqlQueryVariable = VBCode.Identifier(sqlQuery.Name & "SqlQuery", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(sqlQuery, sqlQueryVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append($"Dim {sqlQueryVariable} As New SqlQuery({VBCode.Literal(sqlQuery.Name)}, {parameters.TargetName}, ").
- AppendLine($"{VBCode.Literal(sqlQuery.Sql)})")
-
- Dim sqlQueryParameters = parameters.Cloner.
- WithTargetName(sqlQueryVariable).
- Clone
-
- For Each column In sqlQuery.Columns
- Create(column, metadataVariables, sqlQueryParameters)
- Next
-
- CreateAnnotations(
- sqlQuery,
- AddressOf Generate,
- sqlQueryParameters)
-
- mainBuilder.
- Append($"{parameters.TargetName}.Queries.Add(").
- AppendLine($"{VBCode.Literal(sqlQuery.Name)}, {sqlQueryVariable})")
-
- Return sqlQueryVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The SQL query to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(sqlQuery As ISqlQuery, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate([function] As IStoreFunction,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim functionVariable As String = Nothing
- If metadataVariables.TryGetValue([function], functionVariable) Then
- Return functionVariable
- End If
-
- Dim mainDbFunctionVariable = GetOrCreate([function].DbFunctions.First(), metadataVariables, parameters)
- functionVariable = VBCode.Identifier([function].Name & "Function", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add([function], functionVariable)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- AppendLine($"Dim {functionVariable} As New StoreFunction({mainDbFunctionVariable}, {parameters.TargetName})")
-
- Dim functionParameters = parameters.Cloner.
- WithTargetName(functionVariable).
- Clone
-
- For Each dbFunction In [function].DbFunctions.Skip(1)
-
- Dim dbFunctionVariable = GetOrCreate(dbFunction, metadataVariables, parameters)
-
- mainBuilder.
- AppendLine($"{dbFunctionVariable}.StoreFunction = {functionVariable}").
- AppendLine($"{functionVariable}.DbFunctions.Add({VBCode.Literal(dbFunction.ModelName)}, {dbFunctionVariable})")
- Next
-
- For Each parameter In [function].Parameters
-
- Dim parameterVariable = VBCode.Identifier(parameter.Name & "FunctionParameter", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(parameter, parameterVariable)
- mainBuilder.AppendLine($"Dim {parameterVariable} = {functionVariable}.FindParameter({VBCode.Literal(parameter.Name)})")
-
- CreateAnnotations(
- parameter,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(parameterVariable).
- Clone)
- Next
-
- For Each column In [function].Columns
- Create(column, metadataVariables, functionParameters)
- Next
-
- CreateAnnotations(
- [function],
- AddressOf Generate,
- functionParameters)
-
- mainBuilder.
- AppendLine($"{parameters.TargetName}.Functions.Add(").
- IncrementIndent().
- Append($"({VBCode.Literal([function].Name)}, {VBCode.Literal([function].Schema)}, ").
- AppendLine($"{VBCode.Literal([function].DbFunctions.First().Parameters.Select(Function(p) p.StoreType).ToArray())}),").
- AppendLine($"{functionVariable})").
- DecrementIndent()
-
- Return functionVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The function to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate([function] As IStoreFunction, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function GetOrCreate([function] As IDbFunction,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim functionVariable As String = Nothing
- If metadataVariables.TryGetValue([function], functionVariable) Then
- Return functionVariable
- End If
-
- Dim code = VBCode
- functionVariable = code.Identifier([function].Name, parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add([function], functionVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.AppendLine($"Dim {functionVariable} = DirectCast(Me.FindDbFunction({code.Literal([function].ModelName)}), IRuntimeDbFunction)")
-
- Return functionVariable
- End Function
-
- Private Function GetOrCreate(storeStoredProcedure As IStoreStoredProcedure,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As String
-
- Dim storedProcedureVariable As String = Nothing
- If metadataVariables.TryGetValue(storeStoredProcedure, storedProcedureVariable) Then
- Return storedProcedureVariable
- End If
-
- Dim code = VBCode
- storedProcedureVariable = code.Identifier(storeStoredProcedure.Name & "StoreSproc", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(storeStoredProcedure, storedProcedureVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append($"Dim {storedProcedureVariable} As New StoreStoredProcedure(").
- Append($"{code.Literal(storeStoredProcedure.Name)}, {code.Literal(storeStoredProcedure.Schema)}").
- AppendLine($", {parameters.TargetName})")
-
- Dim sprocParameters = parameters.Cloner.
- WithTargetName(storedProcedureVariable).
- Clone
-
- Dim returnValue = storeStoredProcedure.ReturnValue
-
- If returnValue IsNot Nothing Then
- mainBuilder.
- Append($"{storedProcedureVariable}.ReturnValue = New StoreStoredProcedureReturnValue(").
- AppendLine($""""", {code.Literal(returnValue.StoreType)}, {storedProcedureVariable})")
- End If
-
- For Each parameter In storeStoredProcedure.Parameters
- Create(parameter, metadataVariables, sprocParameters)
- Next
-
- For Each column In storeStoredProcedure.ResultColumns
- Create(column, metadataVariables, sprocParameters)
- Next
-
- For Each storedProcedure In storeStoredProcedure.StoredProcedures
- mainBuilder.
- Append($"{storedProcedureVariable}.AddStoredProcedure(").
- Append(CreateFindSnippet(storedProcedure, metadataVariables)).
- AppendLine(")"c)
- Next
-
- CreateAnnotations(
- storeStoredProcedure,
- AddressOf Generate,
- sprocParameters)
-
- mainBuilder.
- Append($"{parameters.TargetName}.StoredProcedures.Add(").
- AppendLine(
- $"({code.Literal(storeStoredProcedure.Name)}, {code.Literal(storeStoredProcedure.Schema)}), {storedProcedureVariable})")
-
- Return storedProcedureVariable
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The stored procedure to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(storedProcedure As IStoreStoredProcedure, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Function CreateFindSnippet(storedProcedure As IStoredProcedure,
- metadataVariables As Dictionary(Of IAnnotatable, String)) As String
-
- Dim storedProcedureVariable As String = Nothing
- If metadataVariables.TryGetValue(storedProcedure, storedProcedureVariable) Then
- Return storedProcedureVariable
- End If
-
- Dim entityTypeVariable = metadataVariables(storedProcedure.EntityType)
-
- Dim StoreObjectType = storedProcedure.GetStoreIdentifier().StoreObjectType
- Dim methodName As String
- Select Case StoreObjectType
- Case StoreObjectType.InsertStoredProcedure : methodName = "GetInsertStoredProcedure"
- Case StoreObjectType.DeleteStoredProcedure : methodName = "GetDeleteStoredProcedure"
- Case StoreObjectType.UpdateStoredProcedure : methodName = "GetUpdateStoredProcedure"
- Case Else : Throw New Exception("Unexpected stored procedure type: " & StoreObjectType)
- End Select
-
- Return $"DirectCast({entityTypeVariable}.{methodName}(), IRuntimeStoredProcedure)"
- End Function
-
- Private Overloads Sub Create(column As IColumnBase,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
-
- Dim columnVariable = code.Identifier(column.Name & "ColumnBase", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
- Dim mainBuilder = parameters.MainBuilder
- Dim columnType = If(TypeOf column Is JsonColumnBase, "JsonColumnBase", "ColumnBase(Of ColumnMappingBase)")
-
- mainBuilder.
- Append($"Dim {columnVariable} As New {columnType}(").
- Append($"{code.Literal(column.Name)}, {code.Literal(column.StoreType)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.Columns.Add({code.Literal(column.Name)}, {columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As IColumnBase, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(column As IColumn,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
-
- Dim columnVariable = code.Identifier(column.Name & "Column", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- Dim columnType = If(TypeOf column Is JsonColumn, "JsonColumn", "Column")
-
- mainBuilder.
- Append($"Dim {columnVariable} As New {columnType}(").
- Append($"{code.Literal(column.Name)}, {code.Literal(column.StoreType)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.Columns.Add({code.Literal(column.Name)}, {columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As IColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(column As IViewColumn,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim columnVariable = code.Identifier(column.Name & "ViewColumn", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
- Dim mainBuilder = parameters.MainBuilder
-
- Dim columnType = If(TypeOf column Is JsonViewColumn, "JsonViewColumn", "ViewColumn")
- mainBuilder.
- Append($"Dim {columnVariable} As New {columnType}(").
- Append($"{code.Literal(column.Name)}, {code.Literal(column.StoreType)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.Columns.Add({code.Literal(column.Name)}, {columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As IViewColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(column As ISqlQueryColumn,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
-
- Dim columnVariable = code.Identifier(column.Name & "SqlQueryColumn", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append($"Dim {columnVariable} As New SqlQueryColumn(").
- Append($"{code.Literal(column.Name)}, {code.Literal(column.StoreType)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.Columns.Add({code.Literal(column.Name)}, {columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As ISqlQueryColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(column As IFunctionColumn,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim columnVariable = code.Identifier(column.Name & "FunctionColumn", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append($"Dim {columnVariable} As New FunctionColumn(").
- Append($"{code.Literal(column.Name)}, {code.Literal(column.StoreType)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.Columns.Add({code.Literal(column.Name)}, {columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As IFunctionColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The parameter to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(parameter As IStoreFunctionParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(column As IStoreStoredProcedureResultColumn,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim columnVariable = code.Identifier(column.Name & "FunctionColumn", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(column, columnVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append($"Dim {columnVariable} As New StoreStoredProcedureResultColumn({code.Literal(column.Name)}, ").
- Append($"{code.Literal(column.StoreType)}, {code.Literal(column.Position)}, {parameters.TargetName})")
-
- GenerateIsNullableInitializer(column.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.AddResultColumn({columnVariable})")
-
- CreateAnnotations(
- column,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(columnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The column to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(column As IStoreStoredProcedureResultColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(parameter As IStoreStoredProcedureParameter,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim parameterVariable = code.Identifier(parameter.Name & "Parameter", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(parameter, parameterVariable)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append($"Dim {parameterVariable} As New StoreStoredProcedureParameter({code.Literal(parameter.Name)}, ").
- Append($"{code.Literal(parameter.StoreType)}, {code.Literal(parameter.Position)}, {parameters.TargetName}").
- Append($", {code.Literal(parameter.Direction, fullName:=True)})")
-
- GenerateIsNullableInitializer(parameter.IsNullable, mainBuilder, code).
- AppendLine().
- AppendLine($"{parameters.TargetName}.AddParameter({parameterVariable})")
-
- CreateAnnotations(
- parameter,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(parameterVariable).
- Clone)
- End Sub
-
- Private Shared Function GenerateIsNullableInitializer(isNullable As Boolean,
- mainBuilder As IndentedStringBuilder,
- code As IVisualBasicHelper) As IndentedStringBuilder
-
- If isNullable Then
- mainBuilder.
- AppendLine(" With {").
- IncrementIndent().
- AppendLine($".IsNullable = {code.Literal(isNullable)}").
- DecrementIndent().
- Append("}"c)
- End If
-
- Return mainBuilder
- End Function
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The parameter to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(parameter As IStoreStoredProcedureParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(uniqueConstraint As IUniqueConstraint,
- columns As IEnumerable(Of String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim uniqueConstraintVariable = code.Identifier(uniqueConstraint.Name, parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append("Dim ").Append(uniqueConstraintVariable).
- Append(" As New ").
- Append("UniqueConstraint").
- Append("("c).
- Append(code.Literal(uniqueConstraint.Name)).
- Append(", ").
- Append(parameters.TargetName).
- Append(", ").
- Append("{"c).
- AppendJoin(columns).
- AppendLine("})")
-
- If uniqueConstraint.GetIsPrimaryKey() Then
- mainBuilder.
- Append(parameters.TargetName).
- Append(".PrimaryKey = ").
- AppendLine(uniqueConstraintVariable)
- End If
-
- CreateAnnotations(
- uniqueConstraint,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(uniqueConstraintVariable).
- Clone)
-
- For Each mappedForeignKey In uniqueConstraint.MappedKeys
- Dim keyVariable = code.Identifier(uniqueConstraintVariable & "Uc", parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- AppendLine($"Dim {keyVariable} = RelationalModel.GetKey(Me,").
- IncrementIndent().
- AppendLine($"{code.Literal(mappedForeignKey.DeclaringEntityType.Name)},").
- AppendLine($"{code.Literal(mappedForeignKey.Properties.Select(Function(p) p.Name).ToArray())})").
- DecrementIndent()
-
- mainBuilder.AppendLine($"{uniqueConstraintVariable}.MappedKeys.Add({keyVariable})")
- mainBuilder.AppendLine($"RelationalModel.GetOrCreateUniqueConstraints({keyVariable}).Add({uniqueConstraintVariable})")
- Next
-
- mainBuilder.
- Append($"{parameters.TargetName}.UniqueConstraints.Add({code.Literal(uniqueConstraint.Name)}, ").
- AppendLine($"{uniqueConstraintVariable})")
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The unique constraint to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(uniqueConstraint As IUniqueConstraint, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(index As ITableIndex,
- columns As IEnumerable(Of String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim indexVariable = code.Identifier(index.Name, parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append("Dim ").Append(indexVariable).Append(" As New ").Append("TableIndex").AppendLine("("c).
- Append(code.Literal(index.Name)).Append(", ").
- Append(parameters.TargetName).Append(", ").
- Append("{"c).AppendJoin(columns).Append("}, ").
- Append(code.Literal(index.IsUnique)).AppendLine(")"c)
-
- CreateAnnotations(
- index,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(indexVariable).
- Clone)
-
- For Each mappedIndex In index.MappedIndexes
- Dim tableIndexVariable = code.Identifier(indexVariable & "Ix", parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- AppendLine($"Dim {tableIndexVariable} = RelationalModel.GetIndex(Me,").
- IncrementIndent().
- AppendLine($"{code.Literal(mappedIndex.DeclaringEntityType.Name)},").
- AppendLine(
- $"{If(mappedIndex.Name Is Nothing,
- code.Literal(mappedIndex.Properties.Select(Function(p) p.Name).ToArray()),
- code.Literal(mappedIndex.Name))})").
- DecrementIndent()
-
- mainBuilder.
- AppendLine($"{indexVariable}.MappedIndexes.Add({tableIndexVariable})").
- AppendLine($"RelationalModel.GetOrCreateTableIndexes({tableIndexVariable}).Add({indexVariable})")
- Next
-
- mainBuilder.
- AppendLine($"{parameters.TargetName}.Indexes.Add({code.Literal(index.Name)}, {indexVariable})")
- End Sub
-
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The unique constraint to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(index As ITableIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(foreignKey As IForeignKeyConstraint,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim principalTableVariable = metadataVariables(foreignKey.PrincipalTable)
- Dim foreignKeyConstraintVariable = code.Identifier(foreignKey.Name, parameters.ScopeVariables, capitalize:=False)
-
- AddNamespace(GetType(ReferentialAction), parameters.Namespaces)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- AppendLine($"Dim {foreignKeyConstraintVariable} As New ForeignKeyConstraint(").
- IncrementIndent().
- AppendLine($"{code.Literal(foreignKey.Name)}, {parameters.TargetName}, {principalTableVariable},").
- Append("{"c).AppendJoin(foreignKey.Columns.Select(Function(c) metadataVariables(c))).
- AppendLine("},").
- Append($"{principalTableVariable}.FindUniqueConstraint({code.Literal(foreignKey.PrincipalUniqueConstraint.Name)}), ").
- Append(code.Literal(DirectCast(foreignKey.OnDeleteAction, [Enum]))).
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(
- foreignKey,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(foreignKeyConstraintVariable).
- Clone)
-
- For Each mappedForeignKey In foreignKey.MappedForeignKeys
-
- Dim foreignKeyVariable = code.Identifier(foreignKeyConstraintVariable & "Fk", parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- AppendLine($"Dim {foreignKeyVariable} = RelationalModel.GetForeignKey(Me,").IncrementIndent().
- AppendLine($"{code.Literal(mappedForeignKey.DeclaringEntityType.Name)},").
- AppendLine($"{code.Literal(mappedForeignKey.Properties.Select(Function(p) p.Name).ToArray())},").
- AppendLine($"{code.Literal(mappedForeignKey.PrincipalEntityType.Name)},").
- AppendLine($"{code.Literal(mappedForeignKey.PrincipalKey.Properties.Select(Function(p) p.Name).ToArray())})").
- DecrementIndent()
-
- mainBuilder.
- AppendLine($"{foreignKeyConstraintVariable}.MappedForeignKeys.Add({foreignKeyVariable})").
- AppendLine(
- $"RelationalModel.GetOrCreateForeignKeyConstraints({foreignKeyVariable}).Add({foreignKeyConstraintVariable})")
- Next
-
- mainBuilder.
- AppendLine($"{metadataVariables(foreignKey.Table)}.ForeignKeyConstraints.Add({foreignKeyConstraintVariable})").
- AppendLine($"{principalTableVariable}.ReferencingForeignKeyConstraints.Add({foreignKeyConstraintVariable})")
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The foreign key to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(foreignKey As IForeignKeyConstraint, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(tableMapping As ITableMappingBase,
- tableMappingsVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = tableMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim table = tableMapping.Table
- Dim tableVariable = GetOrCreate(table, metadataVariables, parameters)
- Dim tableMappingVariable = code.Identifier(table.Name & "MappingBase", parameters.ScopeVariables, capitalize:=False)
-
- GenerateAddMapping(
- tableMapping,
- tableVariable,
- typeBaseVariable,
- tableMappingsVariable,
- tableMappingVariable,
- "TableMappingBase(Of ColumnMappingBase)",
- parameters)
-
- CreateAnnotations(
- tableMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(tableMappingVariable).
- Clone)
-
- For Each columnMapping In tableMapping.ColumnMappings
- mainBuilder.
- Append("RelationalModel.CreateColumnMapping(").
- Append($"DirectCast({metadataVariables(columnMapping.Column)}, ColumnBase(Of ColumnMappingBase)), ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(tableMappingVariable).AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The table mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(tableMapping As ITableMappingBase, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(tableMapping As ITableMapping,
- tableMappingsVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = tableMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim table = tableMapping.Table
- Dim tableVariable = GetOrCreate(table, metadataVariables, parameters)
- Dim tableMappingVariable = code.Identifier(table.Name & "TableMapping", parameters.ScopeVariables, capitalize:=False)
- metadataVariables.Add(tableMapping, tableMappingVariable)
-
- GenerateAddMapping(
- tableMapping,
- tableVariable,
- typeBaseVariable,
- tableMappingsVariable,
- tableMappingVariable,
- "TableMapping",
- parameters)
-
- CreateAnnotations(
- tableMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(tableMappingVariable).
- Clone)
-
- For Each columnMapping In tableMapping.ColumnMappings
- mainBuilder.
- Append($"RelationalModel.CreateColumnMapping({metadataVariables(columnMapping.Column)}, ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(tableMappingVariable).AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The table mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(tableMapping As ITableMapping, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(viewMapping As IViewMapping,
- viewMappingsVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = viewMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim view = viewMapping.View
- Dim viewVariable = GetOrCreate(view, metadataVariables, parameters)
- Dim viewMappingVariable = code.Identifier(view.Name & "ViewMapping", parameters.ScopeVariables, capitalize:=False)
-
- GenerateAddMapping(
- viewMapping,
- viewVariable,
- typeBaseVariable,
- viewMappingsVariable,
- viewMappingVariable,
- "ViewMapping",
- parameters)
-
- CreateAnnotations(
- viewMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(viewMappingVariable).
- Clone)
-
- For Each columnMapping In viewMapping.ColumnMappings
- mainBuilder.
- Append($"RelationalModel.CreateViewColumnMapping({metadataVariables(columnMapping.Column)}, ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(viewMappingVariable).AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The view mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(viewMapping As IViewMapping, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(sqlQueryMapping As ISqlQueryMapping,
- sqlQueryMappingsVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = sqlQueryMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim sqlQuery = sqlQueryMapping.SqlQuery
- Dim sqlQueryVariable = GetOrCreate(sqlQuery, metadataVariables, parameters)
- Dim sqlQueryMappingVariable = code.Identifier(sqlQuery.Name & "SqlQueryMapping", parameters.ScopeVariables, capitalize:=False)
-
- GenerateAddMapping(
- sqlQueryMapping,
- sqlQueryVariable,
- typeBaseVariable,
- sqlQueryMappingsVariable,
- sqlQueryMappingVariable,
- "SqlQueryMapping",
- parameters)
-
- If sqlQueryMapping.IsDefaultSqlQueryMapping Then
- mainBuilder.
- AppendLine($"{sqlQueryMappingVariable}.IsDefaultSqlQueryMapping = {code.Literal(True)}")
- End If
-
- CreateAnnotations(
- sqlQueryMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(sqlQueryMappingVariable).
- Clone)
-
- For Each columnMapping In sqlQueryMapping.ColumnMappings
- mainBuilder.
- Append($"RelationalModel.CreateSqlQueryColumnMapping({metadataVariables(columnMapping.Column)}, ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(sqlQueryMappingVariable).
- AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The SQL query mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(sqlQueryMapping As ISqlQueryMapping, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(functionMapping As IFunctionMapping,
- functionMappingsVariable As String,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = functionMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim storeFunction = functionMapping.StoreFunction
- Dim functionVariable = GetOrCreate(storeFunction, metadataVariables, parameters)
- Dim dbFunctionVariable = metadataVariables(functionMapping.DbFunction)
- Dim functionMappingVariable = code.Identifier(storeFunction.Name & "FunctionMapping", parameters.ScopeVariables, capitalize:=False)
-
- GenerateAddMapping(
- functionMapping,
- functionVariable,
- typeBaseVariable,
- functionMappingsVariable,
- functionMappingVariable,
- "FunctionMapping",
- parameters,
- $"{dbFunctionVariable}, ")
-
- If functionMapping.IsDefaultFunctionMapping Then
- mainBuilder.
- AppendLine($"{functionMappingVariable}.IsDefaultFunctionMapping = {code.Literal(True)}")
- End If
-
- CreateAnnotations(
- functionMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(functionMappingVariable).
- Clone)
-
- For Each columnMapping In functionMapping.ColumnMappings
- mainBuilder.
- Append($"RelationalModel.CreateFunctionColumnMapping({metadataVariables(columnMapping.Column)}, ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(functionMappingVariable).AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The function mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(functionMapping As IFunctionMapping, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(sprocMapping As IStoredProcedureMapping,
- sprocMappingsVariable As String,
- storeObjectType As StoreObjectType,
- metadataVariables As Dictionary(Of IAnnotatable, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = sprocMapping.TypeBase
- Dim typeBaseVariable = metadataVariables(typeBase)
-
- Dim storeSproc = sprocMapping.StoreStoredProcedure
- Dim storeSprocVariable = GetOrCreate(storeSproc, metadataVariables, parameters)
-
- Dim sprocMappingName As String
- Select Case storeObjectType
- Case StoreObjectType.InsertStoredProcedure : sprocMappingName = "InsertStoredProcedureMapping"
- Case StoreObjectType.DeleteStoredProcedure : sprocMappingName = "DeleteStoredProcedureMapping"
- Case StoreObjectType.UpdateStoredProcedure : sprocMappingName = "UpdateStoredProcedureMapping"
- Case Else : Throw New Exception("Unexpected stored procedure type: " & storeObjectType)
- End Select
-
- Dim sprocSnippet = CreateFindSnippet(sprocMapping.StoredProcedure, metadataVariables)
- Dim sprocVariable = code.Identifier(storeSproc.Name & sprocMappingName(0) & "Sproc", parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- AppendLine($"Dim {sprocVariable} = {CreateFindSnippet(sprocMapping.StoredProcedure, metadataVariables)}")
-
- Dim sprocMappingVariable = code.Identifier(storeSproc.Name & "SprocMapping", parameters.ScopeVariables, capitalize:=False)
- Dim tableMappingVariable = If(sprocMapping.TableMapping IsNot Nothing, metadataVariables(sprocMapping.TableMapping), Nothing)
-
- GenerateAddMapping(
- sprocMapping,
- storeSprocVariable,
- typeBaseVariable,
- sprocMappingsVariable,
- sprocMappingVariable,
- "StoredProcedureMapping",
- parameters,
- $"{sprocSnippet}, {If(tableMappingVariable, "Nothing")}, ")
-
- If tableMappingVariable IsNot Nothing Then
- mainBuilder.
- AppendLine($"{tableMappingVariable}.{sprocMappingName} = {sprocMappingVariable}")
- End If
-
- CreateAnnotations(
- sprocMapping,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(sprocMappingVariable).
- Clone)
-
- For Each parameterMapping In sprocMapping.ParameterMappings
- mainBuilder.
- Append($"RelationalModel.CreateStoredProcedureParameterMapping({metadataVariables(parameterMapping.StoreParameter)}, ").
- Append($"{sprocVariable}.FindParameter({code.Literal(parameterMapping.Parameter.Name)}), ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(parameterMapping.Property.Name)}), ").
- Append(sprocMappingVariable).AppendLine(")"c)
- Next
-
- For Each columnMapping In sprocMapping.ResultColumnMappings
- mainBuilder.
- Append($"RelationalModel.CreateStoredProcedureResultColumnMapping({metadataVariables(columnMapping.StoreResultColumn)}, ").
- Append($"{sprocVariable}.FindResultColumn({code.Literal(columnMapping.ResultColumn.Name)}), ").
- Append($"{typeBaseVariable}.FindProperty({code.Literal(columnMapping.Property.Name)}), ").
- Append(sprocMappingVariable).AppendLine(")"c)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The stored procedure mapping to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(sprocMapping As IStoredProcedureMapping, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Sub GenerateAddMapping(tableMapping As ITableMappingBase,
- tableVariable As String,
- entityTypeVariable As String,
- tableMappingsVariable As String,
- tableMappingVariable As String,
- mappingType As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- Optional additionalParameter As String = Nothing)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim typeBase = tableMapping.TypeBase
-
- mainBuilder.
- Append($"Dim {tableMappingVariable} As New {mappingType}({entityTypeVariable}, ").
- Append($"{tableVariable}, {If(additionalParameter, "")}{code.Literal(tableMapping.IncludesDerivedTypes)}")
-
- If tableMapping.IsSharedTablePrincipal.HasValue OrElse
- tableMapping.IsSplitEntityTypePrincipal.HasValue Then
-
- mainBuilder.
- Append(")"c).
- AppendLine(" With {").
- IncrementIndent()
-
- Dim AddComma = False
-
- If tableMapping.IsSharedTablePrincipal.HasValue Then
- mainBuilder.
- Append(".IsSharedTablePrincipal = ").
- Append(code.Literal(tableMapping.IsSharedTablePrincipal))
- AddComma = True
- End If
-
- If tableMapping.IsSplitEntityTypePrincipal.HasValue Then
- If AddComma Then mainBuilder.AppendLine(","c)
-
- mainBuilder.
- Append(".IsSplitEntityTypePrincipal = ").
- Append(code.Literal(tableMapping.IsSplitEntityTypePrincipal))
- End If
-
- mainBuilder.
- AppendLine().
- DecrementIndent().
- AppendLine("}"c)
- Else
- mainBuilder.AppendLine(")"c)
- End If
-
- Dim table = tableMapping.Table
- Dim isOptional = table.IsOptional(typeBase)
-
- mainBuilder.
- AppendLine($"{tableVariable}.AddTypeMapping({tableMappingVariable}, {code.Literal(isOptional)})").
- AppendLine($"{tableMappingsVariable}.Add({tableMappingVariable})")
-
- If TypeOf typeBase Is IEntityType Then
- Dim entityType = DirectCast(typeBase, IEntityType)
- For Each internalForeignKey In table.GetRowInternalForeignKeys(entityType)
- mainBuilder.
- Append(tableVariable).Append($".AddRowInternalForeignKey({entityTypeVariable}, ").
- AppendLine("RelationalModel.GetForeignKey(Me,").
- IncrementIndent().
- AppendLine($"{code.Literal(internalForeignKey.DeclaringEntityType.Name)},").
- AppendLine($"{code.Literal(internalForeignKey.Properties.Select(Function(p) p.Name).ToArray())},").
- AppendLine($"{code.Literal(internalForeignKey.PrincipalEntityType.Name)},").
- AppendLine($"{code.Literal(internalForeignKey.PrincipalKey.Properties.Select(Function(p) p.Name).ToArray())}))").
- DecrementIndent()
- Next
- End If
- End Sub
-
- Private Overloads Sub Create([function] As IDbFunction,
- functionsVariable As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- If [function].Translation IsNot Nothing Then
- Throw New InvalidOperationException(RelationalStrings.CompiledModelFunctionTranslation([function].Name))
- End If
-
- AddNamespace([function].ReturnType, parameters.Namespaces)
-
- Dim code = VBCode
-
- Dim functionVariable = code.Identifier(
- If([function].MethodInfo?.Name, [function].Name), parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append("Dim ").Append(functionVariable).AppendLine(" As New RuntimeDbFunction(").IncrementIndent().
- Append(code.Literal([function].ModelName)).AppendLine(","c).
- Append(parameters.TargetName).AppendLine(","c).
- Append(code.Literal([function].ReturnType)).AppendLine(","c).
- Append(code.Literal([function].Name))
-
- If [function].Schema IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("schema:=").
- Append(code.Literal([function].Schema))
- End If
-
- If [function].StoreType IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("storeType:=").
- Append(code.Literal([function].StoreType))
- End If
-
- If [function].MethodInfo IsNot Nothing Then
- Dim method = [function].MethodInfo
- AddNamespace(method.DeclaringType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- AppendLine($"methodInfo:={code.Literal(method.DeclaringType)}.GetMethod(").IncrementIndent().
- Append(code.Literal(method.Name)).AppendLine(","c).
- Append(If(method.IsPublic, "BindingFlags.Public", "BindingFlags.NonPublic")).
- Append(If(method.IsStatic, " Or BindingFlags.Static", " Or BindingFlags.Instance")).
- AppendLine(" Or BindingFlags.DeclaredOnly,").
- AppendLine("Nothing,").
- Append("{"c).Append(String.Join(", ", method.GetParameters().Select(Function(p) code.Literal(p.ParameterType)))).AppendLine("},").
- Append("Nothing)").DecrementIndent()
- End If
-
- If [function].IsScalar Then
- mainBuilder.
- AppendLine(","c).
- Append("scalar:=").
- Append(code.Literal([function].IsScalar))
- End If
-
- If [function].IsAggregate Then
- mainBuilder.
- AppendLine(","c).
- Append("aggregate:=").
- Append(code.Literal([function].IsAggregate))
- End If
-
- If [function].IsNullable Then
- mainBuilder.AppendLine(","c).Append("nullable:=").Append(code.Literal([function].IsNullable))
- End If
-
- If [function].IsBuiltIn Then
- mainBuilder.
- AppendLine(","c).
- Append("builtIn:=").
- Append(code.Literal([function].IsBuiltIn))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent().
- AppendLine()
-
- parameters = parameters.Cloner.
- WithTargetName(functionVariable).
- Clone()
-
- For Each parameter In [function].Parameters
- Create(parameter, parameters)
- Next
-
- If [function].TypeMapping IsNot Nothing Then
- mainBuilder.Append(functionVariable).Append(".TypeMapping = ")
- Create(
- [function].TypeMapping,
- parameters.
- Cloner.
- WithTargetName(functionVariable).
- Clone)
- mainBuilder.AppendLine()
- End If
-
- CreateAnnotations(
- [function],
- AddressOf Generate,
- parameters)
-
- mainBuilder.
- Append(functionsVariable).
- Append("("c).
- Append(code.Literal([function].ModelName)).
- Append(") = ").
- AppendLine(functionVariable).
- AppendLine()
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The function to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate([Function] As IDbFunction, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(parameter As IDbFunctionParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- AddNamespace(parameter.ClrType, parameters.Namespaces)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim parameterVariable = code.Identifier(parameter.Name, parameters.ScopeVariables, capitalize:=False)
- mainBuilder.
- Append("Dim ").
- Append(parameterVariable).
- Append(" = ").
- Append(parameters.TargetName).
- AppendLine(".AddParameter(").
- IncrementIndent().
- Append(code.Literal(parameter.Name)).
- AppendLine(","c).
- Append(code.Literal(parameter.ClrType)).
- AppendLine(","c).
- Append(code.Literal(parameter.PropagatesNullability)).
- AppendLine(","c).
- Append(code.Literal(parameter.StoreType)).
- AppendLine(")"c).
- DecrementIndent()
-
- mainBuilder.Append(parameterVariable).Append(".TypeMapping = ")
- Create(
- parameter.TypeMapping,
- parameters.
- Cloner.
- WithTargetName(parameterVariable).
- Clone)
-
- mainBuilder.AppendLine()
-
- CreateAnnotations(
- parameter,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(parameterVariable).
- Clone())
-
- mainBuilder.AppendLine()
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The function parameter to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(functionParameter As IDbFunctionParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(aSequence As ISequence, sequencesVariable As String, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim code = VBCode
- Dim sequenceVariable = code.Identifier(aSequence.Name, parameters.ScopeVariables, capitalize:=False)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(sequenceVariable).
- AppendLine(" As New RuntimeSequence(").
- IncrementIndent().
- Append(code.Literal(aSequence.Name)).
- AppendLine(","c).
- Append(parameters.TargetName).
- AppendLine(","c).
- Append(code.Literal(aSequence.Type))
-
- If aSequence.Schema IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("schema:=").
- Append(code.Literal(aSequence.Schema))
- End If
-
- If aSequence.StartValue <> Sequence.DefaultStartValue Then
- mainBuilder.
- AppendLine(","c).
- Append("startValue:=").
- Append(code.Literal(aSequence.StartValue))
- End If
-
- If aSequence.IncrementBy <> Sequence.DefaultIncrementBy Then
- mainBuilder.
- AppendLine(","c).
- Append("incrementBy:=").
- Append(code.Literal(aSequence.IncrementBy))
- End If
-
- If aSequence.IsCyclic Then
- mainBuilder.
- AppendLine(","c).
- Append("cyclic:=").
- Append(code.Literal(aSequence.IsCyclic))
- End If
-
- If aSequence.MinValue IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("minValue:=").
- Append(code.Literal(aSequence.MinValue))
- End If
-
- If aSequence.MaxValue IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("maxValue:=").
- Append(code.Literal(aSequence.MaxValue))
- End If
-
- If aSequence.ModelSchema Is Nothing AndAlso aSequence.Schema IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("modelSchemaIsNull:=").
- Append(code.Literal(True))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent().
- AppendLine()
-
- CreateAnnotations(
- aSequence,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(sequenceVariable).
- Clone())
-
- mainBuilder.
- Append(sequencesVariable).
- Append("((").Append(code.Literal(aSequence.Name)).Append(", ").
- Append(code.Literal(aSequence.ModelSchema)).Append(")) = ").
- AppendLine(sequenceVariable).
- AppendLine()
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The sequence to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(sequence As ISequence, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(entityType As IEntityType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
-
- If parameters.IsRuntime Then
- annotations.Remove(RelationalAnnotationNames.TableMappings)
- annotations.Remove(RelationalAnnotationNames.ViewMappings)
- annotations.Remove(RelationalAnnotationNames.SqlQueryMappings)
- annotations.Remove(RelationalAnnotationNames.FunctionMappings)
- annotations.Remove(RelationalAnnotationNames.InsertStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.DeleteStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.UpdateStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.DefaultMappings)
- Else
- annotations.Remove(RelationalAnnotationNames.CheckConstraints)
- annotations.Remove(RelationalAnnotationNames.Comment)
- annotations.Remove(RelationalAnnotationNames.IsTableExcludedFromMigrations)
-
- 'These need to be set explicitly to prevent default values from being generated
- annotations(RelationalAnnotationNames.TableName) = entityType.GetTableName()
- annotations(RelationalAnnotationNames.Schema) = entityType.GetSchema()
- annotations(RelationalAnnotationNames.ViewName) = entityType.GetViewName()
- annotations(RelationalAnnotationNames.ViewSchema) = entityType.GetViewSchema()
- annotations(RelationalAnnotationNames.SqlQuery) = entityType.GetSqlQuery()
- annotations(RelationalAnnotationNames.FunctionName) = entityType.GetFunctionName()
-
- Dim fragments As IReadOnlyStoreObjectDictionary(Of IEntityTypeMappingFragment) = Nothing
-
- If annotations.TryGetAndRemove(RelationalAnnotationNames.MappingFragments,
- fragments) Then
-
- AddNamespace(GetType(StoreObjectDictionary(Of RuntimeEntityTypeMappingFragment)), parameters.Namespaces)
- AddNamespace(GetType(StoreObjectIdentifier), parameters.Namespaces)
-
- Dim fragmentsVariable = VBCode.Identifier("fragments", parameters.ScopeVariables, capitalize:=False)
-
- parameters.
- MainBuilder.
- Append("Dim ").Append(fragmentsVariable).AppendLine(" As New StoreObjectDictionary(Of RuntimeEntityTypeMappingFragment)()")
-
- For Each fragment In fragments.GetValues()
- Create(fragment, fragmentsVariable, parameters)
- Next
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.MappingFragments, fragmentsVariable, parameters)
- End If
-
- Dim insertStoredProcedure As StoredProcedure = Nothing
- If annotations.TryGetAndRemove(
- RelationalAnnotationNames.InsertStoredProcedure, insertStoredProcedure) Then
-
- Dim sprocVariable = VBCode.Identifier("insertSproc", parameters.ScopeVariables, capitalize:=False)
-
- Create(insertStoredProcedure, sprocVariable, parameters)
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.InsertStoredProcedure, sprocVariable, parameters)
- parameters.MainBuilder.AppendLine()
- End If
-
- Dim deleteStoredProcedure As StoredProcedure = Nothing
- If annotations.TryGetAndRemove(
- RelationalAnnotationNames.DeleteStoredProcedure, deleteStoredProcedure) Then
-
- Dim sprocVariable = VBCode.Identifier("deleteSproc", parameters.ScopeVariables, capitalize:=False)
-
- Create(deleteStoredProcedure, sprocVariable, parameters)
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.DeleteStoredProcedure, sprocVariable, parameters)
- parameters.MainBuilder.AppendLine()
- End If
-
- Dim updateStoredProcedure As StoredProcedure = Nothing
- If annotations.TryGetAndRemove(
- RelationalAnnotationNames.UpdateStoredProcedure, updateStoredProcedure) Then
- Dim sprocVariable = VBCode.Identifier("updateSproc", parameters.ScopeVariables, capitalize:=False)
-
- Create(updateStoredProcedure, sprocVariable, parameters)
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.UpdateStoredProcedure, sprocVariable, parameters)
- parameters.MainBuilder.AppendLine()
- End If
- End If
-
- MyBase.Generate(entityType, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(complexType As IComplexType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If parameters.IsRuntime Then
- annotations.Remove(RelationalAnnotationNames.TableMappings)
- annotations.Remove(RelationalAnnotationNames.ViewMappings)
- annotations.Remove(RelationalAnnotationNames.SqlQueryMappings)
- annotations.Remove(RelationalAnnotationNames.FunctionMappings)
- annotations.Remove(RelationalAnnotationNames.InsertStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.DeleteStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.UpdateStoredProcedureMappings)
- annotations.Remove(RelationalAnnotationNames.DefaultMappings)
- Else
- ' These need to be set explicitly to prevent default values from being generated
- annotations(RelationalAnnotationNames.TableName) = complexType.GetTableName()
- annotations(RelationalAnnotationNames.Schema) = complexType.GetSchema()
- annotations(RelationalAnnotationNames.ViewName) = complexType.GetViewName()
- annotations(RelationalAnnotationNames.ViewSchema) = complexType.GetViewSchema()
- annotations(RelationalAnnotationNames.SqlQuery) = complexType.GetSqlQuery()
- annotations(RelationalAnnotationNames.FunctionName) = complexType.GetFunctionName()
- End If
-
- MyBase.Generate(complexType, parameters)
- End Sub
-
- Private Overloads Sub Create(fragment As IEntityTypeMappingFragment,
- fragmentsVariable As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim storeObject = fragment.StoreObject
- Dim code = VBCode
- Dim overrideVariable = code.Identifier(storeObject.Name & "Fragment", parameters.ScopeVariables, capitalize:=False)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(overrideVariable).
- AppendLine(" As New RuntimeEntityTypeMappingFragment(").
- IncrementIndent().
- Append(parameters.TargetName).
- AppendLine(","c)
-
- AppendLiteral(storeObject, mainBuilder, code)
-
- mainBuilder.
- AppendLine(","c).
- Append(code.Literal(fragment.IsTableExcludedFromMigrations)).
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(
- fragment,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(overrideVariable).
- Clone)
-
- ' Using reflection because VB currently doesn't seem to be able to call a method that has
- ' an 'in' parameter if it's virtual.
- mainBuilder.
- Append(fragmentsVariable).
- Append($".GetType().GetMethod(""Add"").Invoke({fragmentsVariable}, {{")
-
- AppendLiteral(storeObject, mainBuilder, code)
-
- mainBuilder.
- Append(", ").
- Append(overrideVariable).AppendLine("})")
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The fragment to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(fragment As IEntityTypeMappingFragment, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(storedProcedure As IStoredProcedure, sprocVariable As String, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- AddNamespace(GetType(RuntimeStoredProcedure), parameters.Namespaces)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").Append(sprocVariable).AppendLine(" As New RuntimeStoredProcedure(").
- IncrementIndent().
- Append(parameters.TargetName).AppendLine(","c).
- Append(code.Literal(storedProcedure.Name)).AppendLine(","c).
- Append(code.Literal(storedProcedure.Schema)).AppendLine(","c).
- Append(code.Literal(storedProcedure.IsRowsAffectedReturned)).
- AppendLine(")"c).
- DecrementIndent().
- AppendLine()
-
- parameters = parameters.Cloner.
- WithTargetName(sprocVariable).
- Clone
-
- For Each parameter In storedProcedure.Parameters
- Create(parameter, parameters)
- Next
-
- For Each resultColumn In storedProcedure.ResultColumns
- Create(resultColumn, parameters)
- Next
-
- CreateAnnotations(
- storedProcedure,
- AddressOf Generate,
- parameters)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The stored procedure to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(storedProcedure As IStoredProcedure, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(parameter As IStoredProcedureParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim parameterVariable = code.Identifier(If(parameter.PropertyName, parameter.Name), parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- Append("Dim ").Append(parameterVariable).Append(" = ").
- Append(parameters.TargetName).AppendLine(".AddParameter(").IncrementIndent().
- Append(code.Literal(parameter.Name)).Append(", ").
- Append(code.Literal(DirectCast(parameter.Direction, [Enum]), fullName:=True)).Append(", ").
- Append(code.Literal(parameter.ForRowsAffected)).Append(", ").
- Append(code.Literal(parameter.PropertyName)).Append(", ").
- Append(code.Literal(parameter.ForOriginalValue)).
- AppendLine(")"c).DecrementIndent()
-
- CreateAnnotations(
- parameter,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(parameterVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The stored procedure to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(storedProcedure As IStoredProcedureParameter, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- Private Overloads Sub Create(resultColumn As IStoredProcedureResultColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim code = VBCode
- Dim mainBuilder = parameters.MainBuilder
- Dim resultColumnVariable = code.Identifier(resultColumn.Name, parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- Append("Dim ").Append(resultColumnVariable).Append(" = ").
- Append(parameters.TargetName).AppendLine(".AddResultColumn(").IncrementIndent().
- Append(code.Literal(resultColumn.Name)).Append(", ").
- Append(code.Literal(resultColumn.ForRowsAffected)).Append(", ").
- Append(code.Literal(resultColumn.PropertyName)).
- AppendLine(")"c).DecrementIndent()
-
- CreateAnnotations(
- resultColumn,
- AddressOf Generate,
- parameters.Cloner.
- WithTargetName(resultColumnVariable).
- Clone)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The stored procedure to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(storedProcedure As IStoredProcedureResultColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The check constraint to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate(constraint As ICheckConstraint, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- ''
- Public Overrides Sub Generate([Property] As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim annotations = parameters.Annotations
- If parameters.IsRuntime Then
- annotations.Remove(RelationalAnnotationNames.TableColumnMappings)
- annotations.Remove(RelationalAnnotationNames.ViewColumnMappings)
- annotations.Remove(RelationalAnnotationNames.SqlQueryColumnMappings)
- annotations.Remove(RelationalAnnotationNames.FunctionColumnMappings)
- annotations.Remove(RelationalAnnotationNames.InsertStoredProcedureParameterMappings)
- annotations.Remove(RelationalAnnotationNames.InsertStoredProcedureResultColumnMappings)
- annotations.Remove(RelationalAnnotationNames.DeleteStoredProcedureParameterMappings)
- annotations.Remove(RelationalAnnotationNames.UpdateStoredProcedureParameterMappings)
- annotations.Remove(RelationalAnnotationNames.UpdateStoredProcedureResultColumnMappings)
- annotations.Remove(RelationalAnnotationNames.DefaultColumnMappings)
- Else
- annotations.Remove(RelationalAnnotationNames.ColumnOrder)
- annotations.Remove(RelationalAnnotationNames.Comment)
- annotations.Remove(RelationalAnnotationNames.Collation)
-
- Dim tableOverrides As IReadOnlyStoreObjectDictionary(Of IRelationalPropertyOverrides) = Nothing
-
- If TryGetAndRemove(annotations, RelationalAnnotationNames.RelationalOverrides, tableOverrides) Then
- AddNamespace(GetType(StoreObjectDictionary(Of RuntimeRelationalPropertyOverrides)), parameters.Namespaces)
- AddNamespace(GetType(StoreObjectIdentifier), parameters.Namespaces)
-
- Dim overridesVariable = VBCode.Identifier("overrides", parameters.ScopeVariables, capitalize:=False)
- parameters.MainBuilder.
- AppendLine().
- Append("Dim ").
- Append(overridesVariable).
- AppendLine(" As New StoreObjectDictionary(Of RuntimeRelationalPropertyOverrides)()")
-
- For Each [overrides] In tableOverrides.GetValues()
- Create([overrides], overridesVariable, parameters)
- Next
-
- GenerateSimpleAnnotation(RelationalAnnotationNames.RelationalOverrides, overridesVariable, parameters)
- parameters.MainBuilder.AppendLine()
- End If
- End If
-
- MyBase.Generate([Property], parameters)
- End Sub
-
- Private Overloads Sub Create([overrides] As IRelationalPropertyOverrides,
- overridesVariable As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim storeObject = [overrides].StoreObject
-
- Dim code = VBCode
-
- Dim overrideVariable =
- code.Identifier(parameters.TargetName & Capitalize(storeObject.Name), parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(overrideVariable).
- AppendLine(" As New RuntimeRelationalPropertyOverrides(").
- IncrementIndent().
- Append(parameters.TargetName).AppendLine(","c)
-
- AppendLiteral(storeObject, mainBuilder, code)
-
- mainBuilder.
- AppendLine(","c).
- Append(code.Literal([overrides].IsColumnNameOverridden)).
- AppendLine(","c).
- Append(code.Literal([overrides].ColumnName)).
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(
- [overrides], AddressOf Generate,
- parameters.Cloner.
- WithTargetName(overrideVariable).
- Clone())
-
-
- ' Using reflection because VB currently doesn't seem to be able to call a method that has
- ' an 'in' parameter if it's virtual.
- mainBuilder.
- Append(overridesVariable).
- Append($".GetType().GetMethod(""Add"").Invoke({overridesVariable}, {{")
-
- AppendLiteral(storeObject, mainBuilder, code)
-
- mainBuilder.
- Append(", ").
- Append(overrideVariable).
- AppendLines("})")
- End Sub
-
- '''
- ''' Generates code to create the given annotations.
- '''
- ''' The property overrides to which the annotations are applied.
- ''' Additional parameters used during code generation.
- Public Overridable Overloads Sub Generate([Overrides] As IRelationalPropertyOverrides, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(key As IKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If parameters.IsRuntime Then
- parameters.Annotations.Remove(RelationalAnnotationNames.UniqueConstraintMappings)
- End If
-
- MyBase.Generate(key, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(foreignKey As IForeignKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If parameters.IsRuntime Then
- parameters.Annotations.Remove(RelationalAnnotationNames.ForeignKeyMappings)
- End If
-
- MyBase.Generate(foreignKey, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(index As IIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If parameters.IsRuntime Then
- annotations.Remove(RelationalAnnotationNames.TableIndexMappings)
- Else
- annotations.Remove(RelationalAnnotationNames.Filter)
- End If
-
- MyBase.Generate(index, parameters)
- End Sub
-
- '''
- Public Overrides Function Create(
- typeMapping As CoreTypeMapping,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- Optional valueComparer As ValueComparer = Nothing,
- Optional keyValueComparer As ValueComparer = Nothing,
- Optional providerValueComparer As ValueComparer = Nothing) As Boolean
-
- Dim relationalTypeMapping = TryCast(typeMapping, RelationalTypeMapping)
- If relationalTypeMapping Is Nothing Then
- Return MyBase.Create(typeMapping, parameters, valueComparer, keyValueComparer, providerValueComparer)
- End If
-
- Dim mainBuilder = parameters.MainBuilder
- Dim code = VBCode
-
- If IsSpatial(relationalTypeMapping) Then
- ' Spatial mappings are Not supported in the compiled model
- mainBuilder.Append(code.UnknownLiteral(Nothing))
- Return False
- End If
-
- Dim defaultInstance = DirectCast(CreateDefaultTypeMapping(relationalTypeMapping, parameters), RelationalTypeMapping)
- If defaultInstance Is Nothing Then
- Return True
- End If
-
- parameters.Namespaces.Add(GetType(Type).Namespace)
- parameters.Namespaces.Add(GetType(BindingFlags).Namespace)
-
- Dim cloneMethod = GetCloneMethod(typeMapping.GetType(), {
- "comparer",
- "keyComparer",
- "providerValueComparer",
- "mappingInfo",
- "converter",
- "clrType",
- "storeTypePostfix",
- "jsonValueReaderWriter",
- "elementMapping"
- })
-
- parameters.Namespaces.Add(cloneMethod.DeclaringType.Namespace)
-
- mainBuilder.
- AppendLine($"DirectCast(GetType({code.Reference(cloneMethod.DeclaringType)}).").
- IncrementIndent().
- AppendLine($"GetMethod(""Clone"", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).").
- AppendLine($"Invoke({code.Reference(typeMapping.GetType())}.Default, {{").
- IncrementIndent()
-
- Dim first = True
- For Each p In cloneMethod.GetParameters()
- If first Then
- first = False
- Else
- mainBuilder.AppendLine(","c)
- End If
-
- Select Case p.Name
- Case "comparer"
- Create(If(valueComparer, relationalTypeMapping.Comparer), parameters, code)
-
- Case "keyComparer"
- Create(If(keyValueComparer, relationalTypeMapping.KeyComparer), parameters, code)
-
- Case "providerValueComparer"
- Create(If(providerValueComparer, relationalTypeMapping.ProviderValueComparer), parameters, code)
-
- Case "mappingInfo"
- Dim storeTypeDifferent = relationalTypeMapping.StoreType <> defaultInstance.StoreType
-
- Dim sizeDifferent = relationalTypeMapping.Size.HasValue AndAlso
- (Not defaultInstance.Size.HasValue OrElse relationalTypeMapping.Size.Value <> defaultInstance.Size.Value)
-
- Dim precisionDifferent = relationalTypeMapping.Precision.HasValue AndAlso
- (Not defaultInstance.Precision.HasValue OrElse relationalTypeMapping.Precision.Value <> defaultInstance.Precision.Value)
-
- Dim scaleDifferent = relationalTypeMapping.Scale.HasValue AndAlso
- (Not defaultInstance.Scale.HasValue OrElse relationalTypeMapping.Scale.Value <> defaultInstance.Scale.Value)
-
- Dim dbTypeDifferent = relationalTypeMapping.DbType.HasValue AndAlso
- (Not defaultInstance.DbType.HasValue OrElse relationalTypeMapping.DbType.Value <> defaultInstance.DbType.Value)
-
- Dim isUnicodeDifferent = relationalTypeMapping.IsUnicode <> defaultInstance.IsUnicode
-
- Dim isFixedLengthDifferent = relationalTypeMapping.IsFixedLength <> defaultInstance.IsFixedLength
-
- If storeTypeDifferent OrElse
- sizeDifferent OrElse
- precisionDifferent OrElse
- scaleDifferent OrElse
- dbTypeDifferent OrElse
- isUnicodeDifferent OrElse
- isFixedLengthDifferent Then
-
- AddNamespace(GetType(RelationalTypeMappingInfo), parameters.Namespaces)
- mainBuilder.
- AppendLine("New RelationalTypeMappingInfo(").
- IncrementIndent()
-
- Dim firstParameter = True
- If storeTypeDifferent Then
- GenerateArgument(
- "storeTypeName", code.Literal(relationalTypeMapping.StoreType), mainBuilder, firstParameter)
- End If
-
- If sizeDifferent Then
- GenerateArgument(
- "size", code.Literal(relationalTypeMapping.Size), mainBuilder, firstParameter)
- End If
-
- If isUnicodeDifferent Then
- GenerateArgument(
- "unicode", code.Literal(relationalTypeMapping.IsUnicode), mainBuilder, firstParameter)
- End If
-
- If isFixedLengthDifferent Then
- GenerateArgument(
- "fixedLength", code.Literal(relationalTypeMapping.IsFixedLength), mainBuilder, firstParameter)
- End If
-
- If precisionDifferent Then
- GenerateArgument(
- "precision", code.Literal(relationalTypeMapping.Precision), mainBuilder, firstParameter)
- End If
-
- If scaleDifferent Then
- GenerateArgument(
- "scale", code.Literal(relationalTypeMapping.Scale), mainBuilder, firstParameter)
- End If
-
- If dbTypeDifferent Then
- GenerateArgument(
- "dbType", code.Literal(relationalTypeMapping.DbType.Value, fullName:=True), mainBuilder, firstParameter)
- End If
-
- mainBuilder.
- Append(")"c).
- DecrementIndent()
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "converter"
- If relationalTypeMapping.Converter IsNot Nothing AndAlso
- relationalTypeMapping.Converter IsNot defaultInstance.Converter Then
-
- Create(relationalTypeMapping.Converter, parameters, code)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "clrType"
- Dim typeDifferent = relationalTypeMapping.Converter Is Nothing AndAlso
- relationalTypeMapping.ClrType <> defaultInstance.ClrType
-
- If typeDifferent Then
- mainBuilder.
- Append(code.Literal(relationalTypeMapping.ClrType))
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "storeTypePostfix"
- Dim storeTypePostfixDifferent = relationalTypeMapping.StoreTypePostfix <> defaultInstance.StoreTypePostfix
-
- If storeTypePostfixDifferent Then
- mainBuilder.
- Append(code.Literal(DirectCast(relationalTypeMapping.StoreTypePostfix, [Enum])))
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "jsonValueReaderWriter"
- If relationalTypeMapping.JsonValueReaderWriter IsNot Nothing AndAlso
- relationalTypeMapping.JsonValueReaderWriter IsNot defaultInstance.JsonValueReaderWriter Then
-
- CreateJsonValueReaderWriter(relationalTypeMapping.JsonValueReaderWriter, parameters, code)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "elementMapping"
- If relationalTypeMapping.ElementTypeMapping IsNot Nothing AndAlso
- relationalTypeMapping.ElementTypeMapping IsNot defaultInstance.ElementTypeMapping Then
-
- Create(relationalTypeMapping.ElementTypeMapping, parameters)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case Else
- mainBuilder.Append("Type.Missing")
- End Select
- Next
-
- mainBuilder.
- Append("}), CoreTypeMapping)").
- DecrementIndent().
- DecrementIndent()
-
- Return True
- End Function
-
- Private Shared Sub GenerateArgument(name As String, value As String, builder As IndentedStringBuilder, ByRef firstArgument As Boolean)
- If Not firstArgument Then
- builder.AppendLine(","c)
- End If
-
- firstArgument = False
- builder.Append($"{name}:={value}")
- End Sub
-
- Private Shared Function IsSpatial(relationalTypeMapping As RelationalTypeMapping) As Boolean
- Dim elementTypeMapping = TryCast(relationalTypeMapping.ElementTypeMapping, RelationalTypeMapping)
-
- Return IsSpatialType(relationalTypeMapping.GetType()) OrElse
- (elementTypeMapping IsNot Nothing AndAlso IsSpatialType(elementTypeMapping.GetType()))
- End Function
-
- Private Shared Function IsSpatialType(relationalTypeMappingType As Type) As Boolean
- Return (relationalTypeMappingType.IsGenericType AndAlso
- relationalTypeMappingType.GetGenericTypeDefinition() = GetType(RelationalGeometryTypeMapping(Of ,))) OrElse
- (relationalTypeMappingType.BaseType <> GetType(Object) AndAlso IsSpatialType(relationalTypeMappingType.BaseType))
- End Function
-
- Private Shared Sub CreateAnnotations(Of TAnnotatable As IAnnotatable)(
- Annotatable As TAnnotatable,
- process As Action(Of TAnnotatable, VisualBasicRuntimeAnnotationCodeGeneratorParameters),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- process(
- Annotatable,
- parameters.
- Cloner.
- WithAnnotations(Annotatable.
- GetAnnotations().
- ToDictionary(Function(a) a.Name, Function(a) a.Value)).
- WithIsRuntime(False).
- Clone())
-
- process(
- Annotatable,
- parameters.
- Cloner.
- WithAnnotations(Annotatable.
- GetRuntimeAnnotations().
- ToDictionary(Function(a) a.Name, Function(a) a.Value)).
- WithIsRuntime(True).
- Clone())
- End Sub
-
- Private Shared Function Capitalize(str As String) As String
- Select Case str.Length
- Case 0 : Return str
- Case 1 : Return Char.ToUpperInvariant(str(0)).ToString()
- Case Else
- If Char.IsUpper(str(0)) Then
- Return str
- End If
-
- Return Char.ToUpperInvariant(str(0)) & str.Substring(1)
- End Select
- End Function
-
- Private Shared Sub AppendLiteral(storeObject As StoreObjectIdentifier, builder As IndentedStringBuilder, code As IVisualBasicHelper)
-
- builder.Append("StoreObjectIdentifier.")
-
- Select Case storeObject.StoreObjectType
- Case StoreObjectType.Table
- builder.
- Append("Table(").
- Append(code.Literal(storeObject.Name)).
- Append(", ").
- Append(code.Literal(storeObject.Schema)).
- Append(")"c)
-
- Case StoreObjectType.View
- builder.
- Append("View(").
- Append(code.Literal(storeObject.Name)).
- Append(", ").
- Append(code.Literal(storeObject.Schema)).
- Append(")"c)
-
- Case StoreObjectType.SqlQuery
- builder.
- Append("SqlQuery(").
- Append(code.Literal(storeObject.Name)).
- Append(")"c)
-
- Case StoreObjectType.Function
- builder.
- Append("DbFunction(").
- Append(code.Literal(storeObject.Name)).
- Append(")"c)
-
- Case StoreObjectType.InsertStoredProcedure
- builder.
- Append("InsertStoredProcedure(").
- Append(code.Literal(storeObject.Name)).
- Append(", ").
- Append(code.Literal(storeObject.Schema)).
- Append(")"c)
-
- Case StoreObjectType.DeleteStoredProcedure
- builder.
- Append("DeleteStoredProcedure(").
- Append(code.Literal(storeObject.Name)).
- Append(", ").
- Append(code.Literal(storeObject.Schema)).
- Append(")"c)
-
- Case StoreObjectType.UpdateStoredProcedure
- builder.
- Append("UpdateStoredProcedure(").
- Append(code.Literal(storeObject.Name)).
- Append(", ").
- Append(code.Literal(storeObject.Schema)).
- Append(")"c)
-
- Case Else
- DebugAssert(True, "Unexpected StoreObjectType: " & storeObject.StoreObjectType)
- End Select
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index be5c534..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,184 +0,0 @@
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.SqlServer.Metadata.Internal
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Class SqlServerVisualBasicRuntimeAnnotationCodeGenerator
- Inherits RelationalVisualBasicRuntimeAnnotationCodeGenerator
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Sub New(vbHelper As IVisualBasicHelper)
- MyBase.New(vbHelper)
- End Sub
-
- '''
- Public Overrides Sub Generate(model As IModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.IdentityIncrement)
- .Remove(SqlServerAnnotationNames.IdentitySeed)
- .Remove(SqlServerAnnotationNames.MaxDatabaseSize)
- .Remove(SqlServerAnnotationNames.PerformanceLevelSql)
- .Remove(SqlServerAnnotationNames.ServiceTierSql)
- End With
- End If
-
- MyBase.Generate(model, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(model As IRelationalModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.MemoryOptimized)
- .Remove(SqlServerAnnotationNames.EditionOptions)
- End With
- End If
-
- MyBase.Generate(model, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate([Property] As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.IdentityIncrement)
- .Remove(SqlServerAnnotationNames.IdentitySeed)
- .Remove(SqlServerAnnotationNames.Sparse)
-
- If Not .ContainsKey(SqlServerAnnotationNames.ValueGenerationStrategy) Then
- .Item(SqlServerAnnotationNames.ValueGenerationStrategy) = [Property].GetValueGenerationStrategy()
- End If
- End With
- End If
-
- MyBase.Generate([Property], parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(column As IColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.Identity)
- .Remove(SqlServerAnnotationNames.Sparse)
- .Remove(SqlServerAnnotationNames.IsTemporal)
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableName)
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableSchema)
- .Remove(SqlServerAnnotationNames.TemporalPeriodStartColumnName)
- .Remove(SqlServerAnnotationNames.TemporalPeriodEndColumnName)
- End With
- End If
-
- MyBase.Generate(column, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(index As IIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.Clustered)
- .Remove(SqlServerAnnotationNames.CreatedOnline)
- .Remove(SqlServerAnnotationNames.Include)
- .Remove(SqlServerAnnotationNames.FillFactor)
- .Remove(SqlServerAnnotationNames.SortInTempDb)
- .Remove(SqlServerAnnotationNames.DataCompression)
- End With
- End If
-
- MyBase.Generate(index, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(index As ITableIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.Clustered)
- .Remove(SqlServerAnnotationNames.CreatedOnline)
- .Remove(SqlServerAnnotationNames.Include)
- .Remove(SqlServerAnnotationNames.FillFactor)
- .Remove(SqlServerAnnotationNames.SortInTempDb)
- .Remove(SqlServerAnnotationNames.DataCompression)
- End With
- End If
-
- MyBase.Generate(index, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(aKey As IKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.Clustered)
- End With
- End If
-
- MyBase.Generate(aKey, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(uniqueConstraint As IUniqueConstraint, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.Clustered)
- End With
- End If
-
- MyBase.Generate(uniqueConstraint, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(entityType As IEntityType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableName)
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableSchema)
- .Remove(SqlServerAnnotationNames.TemporalPeriodEndPropertyName)
- .Remove(SqlServerAnnotationNames.TemporalPeriodStartPropertyName)
- End With
- End If
-
- MyBase.Generate(entityType, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(table As ITable, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.MemoryOptimized)
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableName)
- .Remove(SqlServerAnnotationNames.TemporalHistoryTableSchema)
- .Remove(SqlServerAnnotationNames.TemporalPeriodEndColumnName)
- .Remove(SqlServerAnnotationNames.TemporalPeriodStartColumnName)
- End With
- End If
-
- MyBase.Generate(table, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate([overrides] As IRelationalPropertyOverrides, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- If Not parameters.IsRuntime Then
- With parameters.Annotations
- .Remove(SqlServerAnnotationNames.IdentityIncrement)
- .Remove(SqlServerAnnotationNames.IdentitySeed)
- End With
- End If
-
- MyBase.Generate([overrides], parameters)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicServices.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicServices.vb
deleted file mode 100644
index c6ff48d..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqlServerVisualBasicServices.vb
+++ /dev/null
@@ -1,13 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.Extensions.DependencyInjection
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- Public Class SqlServerVisualBasicServices
- Implements IDesignTimeServices
-
- Public Sub ConfigureDesignTimeServices(services As IServiceCollection) Implements IDesignTimeServices.ConfigureDesignTimeServices
- services.AddSingleton(Of IVisualBasicRuntimeAnnotationCodeGenerator, SqlServerVisualBasicRuntimeAnnotationCodeGenerator)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index 1c2edcd..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,56 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Sqlite.Metadata.Internal
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Class SqliteVisualBasicRuntimeAnnotationCodeGenerator
- Inherits RelationalVisualBasicRuntimeAnnotationCodeGenerator
-
- '''
- ''' This is an internal API that supports the Entity Framework Core infrastructure and not subject to
- ''' the same compatibility standards as public APIs. It may be changed or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution and knowing that
- ''' doing so can result in application failures when updating to a new Entity Framework Core release.
- '''
- Public Sub New(vbHelper As IVisualBasicHelper)
- MyBase.New(vbHelper)
- End Sub
-
- '''
- Public Overrides Sub Generate(model As IRelationalModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If Not parameters.IsRuntime Then
- annotations.Remove(SqliteAnnotationNames.InitSpatialMetaData)
- End If
-
- MyBase.Generate(model, parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate([property] As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If Not parameters.IsRuntime Then
- annotations.Remove(SqliteAnnotationNames.Srid)
- End If
-
- MyBase.Generate([property], parameters)
- End Sub
-
- '''
- Public Overrides Sub Generate(column As IColumn, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Dim annotations = parameters.Annotations
- If Not parameters.IsRuntime Then
- annotations.Remove(SqliteAnnotationNames.Autoincrement)
- annotations.Remove(SqliteAnnotationNames.Srid)
- End If
-
- MyBase.Generate(column, parameters)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicServices.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicServices.vb
deleted file mode 100644
index 17241e4..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/SqliteVisualBasicServices.vb
+++ /dev/null
@@ -1,13 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.Extensions.DependencyInjection
-
-Namespace Design.AnnotationCodeGeneratorProvider
-
- Public Class SqliteVisualBasicServices
- Implements IDesignTimeServices
-
- Public Sub ConfigureDesignTimeServices(services As IServiceCollection) Implements IDesignTimeServices.ConfigureDesignTimeServices
- services.AddSingleton(Of IVisualBasicRuntimeAnnotationCodeGenerator, SqliteVisualBasicRuntimeAnnotationCodeGenerator)
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/VisualBasicDesignTimeProviderServicesAttribute.vb b/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/VisualBasicDesignTimeProviderServicesAttribute.vb
deleted file mode 100644
index 3ca4dae..0000000
--- a/EFCore.VisualBasic/Design/RuntimeAnnotationCodeGenerator/VisualBasicDesignTimeProviderServicesAttribute.vb
+++ /dev/null
@@ -1,19 +0,0 @@
-Namespace Design.AnnotationCodeGeneratorProvider
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards As public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
-
- Public Class VisualBasicDesignTimeProviderServicesAttribute
- Inherits Attribute
-
- Public ReadOnly Property ProviderName As String
-
- Sub New(providerName As String)
- Me.ProviderName = NotNull(providerName, NameOf(providerName))
- End Sub
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGenerator.vb b/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGenerator.vb
deleted file mode 100644
index 7924c53..0000000
--- a/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGenerator.vb
+++ /dev/null
@@ -1,655 +0,0 @@
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.EntityFrameworkCore.Storage.ValueConversion
-
-Namespace Design
- '''
- ''' Base class to be used by database providers when implementing an
- '''
- Public Class VisualBasicRuntimeAnnotationCodeGenerator
- Implements IVisualBasicRuntimeAnnotationCodeGenerator
-
- '''
- ''' Initializes a new instance of this class.
- '''
- ''' The Visual Basic helper.
- Public Sub New(vbHelper As IVisualBasicHelper)
- VBCode = NotNull(vbHelper, NameOf(vbHelper))
- End Sub
-
- '''
- ''' The Visual Basic helper.
- '''
- Protected VBCode As IVisualBasicHelper
-
- '''
- Public Overridable Sub Generate(model As IModel, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- With parameters.Annotations
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) AndAlso
- annotation.Key <> CoreAnnotationNames.ProductVersion AndAlso
- annotation.Key <> CoreAnnotationNames.FullChangeTrackingNotificationsRequired Then
-
- .Remove(annotation.Key)
- End If
- Next
- Else
- .Remove(CoreAnnotationNames.ModelDependencies)
- .Remove(CoreAnnotationNames.ReadOnlyModel)
- End If
- End With
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(entityType As IEntityType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- Dim annotations = parameters.Annotations
-
- If Not parameters.IsRuntime Then
- For Each annotation In annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) AndAlso
- annotation.Key <> CoreAnnotationNames.DiscriminatorMappingComplete Then
-
- annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(complexProperty As IComplexProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- Dim annotations = parameters.Annotations
-
- If Not parameters.IsRuntime Then
- For Each annotation In annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) AndAlso
- annotation.Key <> CoreAnnotationNames.DiscriminatorMappingComplete Then
-
- annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(complexType As IComplexType, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- Dim annotations = parameters.Annotations
- If Not parameters.IsRuntime Then
- For Each annotation In annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) AndAlso
- annotation.Key <> CoreAnnotationNames.DiscriminatorMappingComplete Then
-
- annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(prop As IProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(prop As IServiceProperty, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(key As IKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(foreignKey As IForeignKey, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(navigation As INavigation, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(navigation As ISkipNavigation, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(index As IIndex, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(trigger As ITrigger, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- Dim annotations = parameters.Annotations
- For Each annotation In annotations
- Dim Key = annotation.Key
-
- If CoreAnnotationNames.AllNames.Contains(Key) Then
- annotations.Remove(Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- Public Overridable Sub Generate(typeConfiguration As ITypeMappingConfiguration, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Generate
-
- If Not parameters.IsRuntime Then
- For Each annotation In parameters.Annotations
- If CoreAnnotationNames.AllNames.Contains(annotation.Key) Then
- parameters.Annotations.Remove(annotation.Key)
- End If
- Next
- End If
-
- GenerateSimpleAnnotations(parameters)
- End Sub
-
- '''
- ''' Generates code to create the given annotations using literals.
- '''
- ''' Parameters used during code generation.
- Protected Overridable Sub GenerateSimpleAnnotations(parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- For Each Annotation In parameters.Annotations.OrderBy(Function(a) a.Key)
-
- If Annotation.Value IsNot Nothing Then
- AddNamespace(If(TryCast(Annotation.Value, Type), Annotation.Value.GetType()), parameters.Namespaces)
- End If
-
- GenerateSimpleAnnotation(Annotation.Key, VBCode.UnknownLiteral(Annotation.Value), parameters)
- Next
- End Sub
-
- '''
- ''' Generates code to create the given annotation.
- '''
- ''' The annotation name.
- ''' The annotation value as a literal.
- ''' Additional parameters used during code generation.
- Protected Overridable Sub GenerateSimpleAnnotation(annotationName As String,
- valueString As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- If parameters.TargetName <> "Me" Then
- parameters.MainBuilder.
- Append(parameters.TargetName).
- Append("."c)
- End If
-
- parameters.MainBuilder.
- Append(If(parameters.IsRuntime, "AddRuntimeAnnotation(", "AddAnnotation(")).
- Append(VBCode.Literal(annotationName)).
- Append(", ").
- Append(valueString).
- AppendLine(")"c)
- End Sub
-
- '''
- ''' Adds the namespaces for the given type.
- '''
- ''' A type.
- ''' The set of namespaces to add to.
- Public Shared Sub AddNamespace(type As Type, namespaces As ISet(Of String))
-
- If type.IsNested Then
- AddNamespace(type.DeclaringType, namespaces)
- ElseIf Not String.IsNullOrEmpty(type.Namespace) Then
- namespaces.Add(type.Namespace)
- End If
-
- If type.IsGenericType Then
- For Each argument As Type In type.GenericTypeArguments
- AddNamespace(argument, namespaces)
- Next
- End If
-
- If type.IsArray Then
- AddNamespace(type.GetSequenceType(), namespaces)
- End If
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Shared Sub Create(converter As ValueConverter,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- codeHelper As IVisualBasicHelper)
-
- Dim mainBuilder = parameters.MainBuilder
- Dim constructor = converter.GetType().GetDeclaredConstructor({GetType(JsonValueReaderWriter)})
- Dim jsonReaderWriterProperty = converter.GetType().GetProperty(NameOf(CollectionToJsonStringConverter(Of Object).JsonReaderWriter))
-
- If constructor Is Nothing OrElse jsonReaderWriterProperty Is Nothing Then
- AddNamespace(GetType(ValueConverter(Of ,)), parameters.Namespaces)
- AddNamespace(converter.ModelClrType, parameters.Namespaces)
- AddNamespace(converter.ProviderClrType, parameters.Namespaces)
-
- mainBuilder.
- Append("New ValueConverter(Of ").
- Append(codeHelper.Reference(converter.ModelClrType)).
- Append(", ").
- Append(codeHelper.
- Reference(converter.ProviderClrType)).
- AppendLine(")(").
- IncrementIndent().
- Append(codeHelper.Expression(converter.ConvertToProviderExpression, parameters.Namespaces)).
- AppendLine(","c).
- Append(codeHelper.Expression(converter.ConvertFromProviderExpression, parameters.Namespaces))
-
- If converter.ConvertsNulls Then
- mainBuilder.
- AppendLine(","c).
- Append("convertsNulls:=True")
- End If
-
- mainBuilder.
- Append(")"c).
- DecrementIndent()
- Else
- AddNamespace(converter.GetType(), parameters.Namespaces)
-
- mainBuilder.
- Append("New ").
- Append(codeHelper.Reference(converter.GetType())).
- Append("("c)
-
- CreateJsonValueReaderWriter(DirectCast(jsonReaderWriterProperty.GetValue(converter), JsonValueReaderWriter), parameters, codeHelper)
-
- mainBuilder.
- Append(")"c)
- End If
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Shared Sub Create(comparer As ValueComparer,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- codeHelper As IVisualBasicHelper)
-
- Dim mainBuilder = parameters.MainBuilder
- Dim constructor = comparer.GetType().GetDeclaredConstructor({GetType(ValueComparer)})
- Dim elementComparerProperty = comparer.GetType().GetProperty(NameOf(ListComparer(Of Object).ElementComparer))
-
- If constructor Is Nothing OrElse elementComparerProperty Is Nothing Then
- AddNamespace(GetType(ValueComparer()), parameters.Namespaces)
- AddNamespace(comparer.Type, parameters.Namespaces)
-
- mainBuilder.
- Append("New ValueComparer(Of ").
- Append(codeHelper.Reference(comparer.Type)).
- AppendLine(")(").
- IncrementIndent().
- AppendLines(codeHelper.Expression(comparer.EqualsExpression, parameters.Namespaces), skipFinalNewline:=True).
- AppendLine(","c).
- AppendLines(codeHelper.Expression(comparer.HashCodeExpression, parameters.Namespaces), skipFinalNewline:=True).
- AppendLine(","c).
- AppendLines(codeHelper.Expression(comparer.SnapshotExpression, parameters.Namespaces), skipFinalNewline:=True).
- Append(")"c).
- DecrementIndent()
- Else
- AddNamespace(comparer.GetType(), parameters.Namespaces)
-
- mainBuilder.
- Append("New ").
- Append(codeHelper.Reference(comparer.GetType())).Append("("c)
-
- Create(DirectCast(elementComparerProperty.GetValue(comparer), ValueComparer), parameters, codeHelper)
-
- mainBuilder.
- Append(")"c)
- End If
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Shared Sub CreateJsonValueReaderWriter(jsonValueReaderWriter As JsonValueReaderWriter,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- codeHelper As IVisualBasicHelper)
-
- Dim mainBuilder = parameters.MainBuilder
- Dim jsonValueReaderWriterType = jsonValueReaderWriter.GetType()
-
- Dim jsonConvertedValueReaderWriter = TryCast(jsonValueReaderWriter, IJsonConvertedValueReaderWriter)
- If jsonConvertedValueReaderWriter IsNot Nothing Then
- AddNamespace(jsonValueReaderWriterType, parameters.Namespaces)
-
- mainBuilder.
- Append("New ").
- Append(codeHelper.Reference(jsonValueReaderWriterType)).
- AppendLine("("c).
- IncrementIndent()
-
- CreateJsonValueReaderWriter(jsonConvertedValueReaderWriter.InnerReaderWriter, parameters, codeHelper)
- mainBuilder.AppendLine(","c)
- Create(jsonConvertedValueReaderWriter.Converter, parameters, codeHelper)
-
- mainBuilder.
- Append(")"c).
- DecrementIndent()
-
- Exit Sub
- End If
-
- Dim compositeJsonValueReaderWriter = TryCast(jsonValueReaderWriter, ICompositeJsonValueReaderWriter)
- If compositeJsonValueReaderWriter IsNot Nothing Then
- AddNamespace(jsonValueReaderWriterType, parameters.Namespaces)
-
- mainBuilder.
- Append("New ").
- Append(codeHelper.Reference(jsonValueReaderWriterType)).
- AppendLine("("c).
- IncrementIndent()
-
- CreateJsonValueReaderWriter(compositeJsonValueReaderWriter.InnerReaderWriter, parameters, codeHelper)
-
- mainBuilder.
- Append(")"c).
- DecrementIndent()
- Exit Sub
- End If
-
- CreateJsonValueReaderWriter(jsonValueReaderWriterType, parameters, codeHelper)
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Shared Sub CreateJsonValueReaderWriter(jsonValueReaderWriterType As Type,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- codeHelper As IVisualBasicHelper)
-
- Dim mainBuilder = parameters.MainBuilder
- AddNamespace(jsonValueReaderWriterType, parameters.Namespaces)
-
- Dim instanceProperty = jsonValueReaderWriterType.GetProperty("Instance")
-
- If instanceProperty IsNot Nothing AndAlso
- instanceProperty.IsStatic() AndAlso
- instanceProperty.GetMethod?.IsPublic = True AndAlso
- jsonValueReaderWriterType.IsAssignableFrom(instanceProperty.PropertyType) AndAlso
- jsonValueReaderWriterType.IsPublic Then
-
- mainBuilder.
- Append(codeHelper.Reference(jsonValueReaderWriterType)).
- Append(".Instance")
- Else
- mainBuilder.
- Append("New ").
- Append(codeHelper.Reference(jsonValueReaderWriterType)).
- Append("()")
- End If
- End Sub
-
- '''
- Public Overridable Function Create(typeMapping As CoreTypeMapping,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- Optional valueComparer As ValueComparer = Nothing,
- Optional keyValueComparer As ValueComparer = Nothing,
- Optional providerValueComparer As ValueComparer = Nothing) As Boolean _
- Implements IVisualBasicRuntimeAnnotationCodeGenerator.Create
-
- Dim mainBuilder = parameters.MainBuilder
- Dim code = VBCode
- Dim defaultInstance = CreateDefaultTypeMapping(typeMapping, parameters)
-
- If defaultInstance Is Nothing Then
- Return True
- End If
-
- parameters.Namespaces.Add(GetType(Type).Namespace)
- parameters.Namespaces.Add(GetType(BindingFlags).Namespace)
-
- Dim cloneMethod = GetCloneMethod(typeMapping.GetType(), {
- "comparer",
- "keyComparer",
- "providerValueComparer",
- "converter",
- "clrType",
- "jsonValueReaderWriter",
- "elementMapping"
- })
-
- parameters.Namespaces.Add(cloneMethod.DeclaringType.Namespace)
-
- mainBuilder.
- AppendLine($"DirectCast(GetType({code.Reference(cloneMethod.DeclaringType)}).").
- IncrementIndent().
- AppendLine($"GetMethod(""Clone"", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).").
- AppendLine($"Invoke({code.Reference(typeMapping.GetType())}.Default, {{").
- IncrementIndent()
-
- Dim first = True
- For Each p In cloneMethod.GetParameters()
- If first Then
- first = False
- Else
- mainBuilder.AppendLine(","c)
- End If
-
- Select Case p.Name
- Case "comparer"
- Create(If(valueComparer, typeMapping.Comparer), parameters, code)
-
- Case "keyComparer"
- Create(If(keyValueComparer, typeMapping.KeyComparer), parameters, code)
-
- Case "providerValueComparer"
- Create(If(providerValueComparer, typeMapping.ProviderValueComparer), parameters, code)
-
- Case "converter"
- If typeMapping.Converter IsNot Nothing AndAlso
- typeMapping.Converter IsNot defaultInstance.Converter Then
- Create(typeMapping.Converter, parameters, code)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "clrType"
- If typeMapping.Converter Is Nothing AndAlso
- typeMapping.ClrType <> defaultInstance.ClrType Then
-
- mainBuilder.Append(code.Literal(typeMapping.ClrType))
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "jsonValueReaderWriter"
- If typeMapping.JsonValueReaderWriter IsNot Nothing AndAlso
- typeMapping.JsonValueReaderWriter IsNot defaultInstance.JsonValueReaderWriter Then
-
- CreateJsonValueReaderWriter(typeMapping.JsonValueReaderWriter, parameters, code)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case "elementMapping"
- If typeMapping.ElementTypeMapping IsNot Nothing AndAlso
- typeMapping.ElementTypeMapping IsNot defaultInstance.ElementTypeMapping Then
-
- Create(typeMapping.ElementTypeMapping, parameters)
- Else
- mainBuilder.Append("Type.Missing")
- End If
-
- Case Else
- mainBuilder.Append("Type.Missing")
- End Select
- Next
-
- mainBuilder.
- Append("}), CoreTypeMapping)").
- DecrementIndent().
- DecrementIndent()
-
- Return True
- End Function
-
- Protected Function GetCloneMethod(t As Type, requiredParameters As IEnumerable(Of String)) As MethodInfo
- Dim methodsFound =
- From m In t.GetMethods(BindingFlags.Public Or BindingFlags.Instance)
- Let params = m.GetParameters()
- Where m.Name = "Clone" AndAlso
- requiredParameters.All(Function(rp) params.Any(Function(p) p.Name = rp))
- Order By params.Length()
- Select m
-
- Return methodsFound.First
- End Function
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Protected Overridable Function CreateDefaultTypeMapping(
- typeMapping As CoreTypeMapping,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters) As CoreTypeMapping
-
- Dim typeMappingType = typeMapping.GetType()
- Dim mainBuilder = parameters.MainBuilder
- Dim defaultProperty = typeMappingType.GetProperty("Default")
-
- If defaultProperty Is Nothing OrElse
- Not defaultProperty.IsStatic() OrElse
- defaultProperty.GetMethod?.IsPublic <> True OrElse
- Not typeMappingType.IsAssignableFrom(defaultProperty.PropertyType) OrElse
- Not typeMappingType.IsPublic Then
-
- Throw New InvalidOperationException(
- VBDesignStrings.CompiledModelIncompatibleTypeMapping(typeMappingType.ShortDisplayName()))
- End If
-
- AddNamespace(typeMappingType, parameters.Namespaces)
-
- Dim defaultInstance = DirectCast(defaultProperty.GetValue(Nothing), CoreTypeMapping)
- If typeMapping Is defaultInstance Then
- mainBuilder.Append($"{VBCode.Reference(typeMapping.GetType())}.Default")
- Return Nothing
- Else
- Return defaultInstance
- End If
- End Function
-
- Protected Shared Function TryGetAndRemove(Of TKey, TValue, TReturn)(source As IDictionary(Of TKey, TValue),
- key As TKey,
- ByRef annotationValue As TReturn) As Boolean
-
- Return source.TryGetAndRemove(key, annotationValue)
- End Function
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGeneratorParameters.vb b/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGeneratorParameters.vb
deleted file mode 100644
index 3f3a6f2..0000000
--- a/EFCore.VisualBasic/Design/VisualBasicRuntimeAnnotationCodeGeneratorParameters.vb
+++ /dev/null
@@ -1,164 +0,0 @@
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-
-Namespace Design
-
- '''
- ''' The parameter object for a
- '''
- Public Class VisualBasicRuntimeAnnotationCodeGeneratorParameters
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards as public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- '''
- ''' Do Not call this constructor directly from either provider Or application code as it may change
- ''' as New dependencies are added. Instead, use this type in your constructor so that an instance
- ''' will be created And injected automatically by the dependency injection container. To create
- ''' an instance with some dependent services replaced, first resolve the object from the dependency
- ''' injection container, then replace selected services using the 'With...' methods. Do not call
- ''' the constructor at any point in this process.
- '''
-
- Public Sub New(targetName As String,
- className As String,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As ISet(Of String),
- scopeVariables As ISet(Of String),
- Optional annotations As IDictionary(Of String, Object) = Nothing,
- Optional isRuntime As Boolean = False)
-
- Me.TargetName = targetName
- Me.ClassName = className
- Me.MainBuilder = mainBuilder
- Me.MethodBuilder = methodBuilder
- Me.Namespaces = namespaces
- Me.ScopeVariables = scopeVariables
- Me.Annotations = annotations
- Me.IsRuntime = isRuntime
- End Sub
-
- '''
- ''' The set of annotations from which to generate fluent API calls.
- '''
- Public ReadOnly Property Annotations As IDictionary(Of String, Object)
-
- '''
- ''' The name of the target variable.
- '''
- Public ReadOnly Property TargetName As String
-
- '''
- ''' The name of the current class.
- '''
- Public ReadOnly Property ClassName As String
-
- '''
- ''' The builder for the code building the metadata item.
- '''
- Public ReadOnly Property MainBuilder As IndentedStringBuilder
-
- '''
- ''' The builder that could be used to add members to the current class.
- '''
- Public ReadOnly Property MethodBuilder As IndentedStringBuilder
-
- '''
- ''' A collection of namespaces for generation.
- '''
- Public ReadOnly Property Namespaces As ISet(Of String)
-
- '''
- ''' A collection of variable names in the current scope.
- '''
- Public ReadOnly Property ScopeVariables As ISet(Of String)
-
- '''
- ''' Indicates whether the given annotations are runtime annotations.
- '''
- Public ReadOnly Property IsRuntime As Boolean
-
-
- Public Function Cloner() As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- Return New VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner(Me)
- End Function
-
- Public Class VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- Private _Annotations As IDictionary(Of String, Object)
- Private _TargetName As String
- Private _ClassName As String
- Private _MainBuilder As IndentedStringBuilder
- Private _MethodBuilder As IndentedStringBuilder
- Private _Namespaces As ISet(Of String)
- Private _ScopeVariables As ISet(Of String)
- Private _IsRuntime As Boolean
-
- Friend Sub New(parametersToClone As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
- Me._Annotations = parametersToClone.Annotations
- Me._TargetName = parametersToClone.TargetName
- Me._ClassName = parametersToClone.ClassName
- Me._MainBuilder = parametersToClone.MainBuilder
- Me._MethodBuilder = parametersToClone.MethodBuilder
- Me._Namespaces = parametersToClone.Namespaces
- Me._ScopeVariables = parametersToClone.ScopeVariables
- Me._IsRuntime = parametersToClone.IsRuntime
- End Sub
-
- Public Function WithTargetName(targetName As String) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _TargetName = targetName
- Return Me
- End Function
-
- Public Function WithClassName(className As String) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _ClassName = className
- Return Me
- End Function
-
- Public Function WithMainBuilder(mainBuilder As IndentedStringBuilder) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _MainBuilder = mainBuilder
- Return Me
- End Function
-
- Public Function WithMethodBuilder(methodBuilder As IndentedStringBuilder) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _MethodBuilder = methodBuilder
- Return Me
- End Function
-
- Public Function WithNamespaces(namespaces As ISet(Of String)) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _Namespaces = namespaces
- Return Me
- End Function
-
- Public Function WithScopeVariables(scopeVariables As ISet(Of String)) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _ScopeVariables = scopeVariables
- Return Me
- End Function
-
- Public Function WithAnnotations(annotations As IDictionary(Of String, Object)) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _Annotations = annotations
- Return Me
- End Function
-
- Public Function WithIsRuntime(isRuntime As Boolean) As VisualBasicRuntimeAnnotationCodeGeneratorParametersCloner
- _IsRuntime = isRuntime
- Return Me
- End Function
-
- Public Function Clone() As VisualBasicRuntimeAnnotationCodeGeneratorParameters
- Return New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- targetName:=_TargetName,
- className:=_ClassName,
- mainBuilder:=_MainBuilder,
- methodBuilder:=_MethodBuilder,
- namespaces:=_Namespaces,
- scopeVariables:=_ScopeVariables,
- annotations:=_Annotations,
- isRuntime:=_IsRuntime
- )
- End Function
- End Class
- End Class
-End Namespace
diff --git a/EFCore.VisualBasic/Scaffolding/Internal/VisualBasicRuntimeModelCodeGenerator.vb b/EFCore.VisualBasic/Scaffolding/Internal/VisualBasicRuntimeModelCodeGenerator.vb
deleted file mode 100644
index a66415a..0000000
--- a/EFCore.VisualBasic/Scaffolding/Internal/VisualBasicRuntimeModelCodeGenerator.vb
+++ /dev/null
@@ -1,1753 +0,0 @@
-Imports System.Reflection
-Imports System.Text
-Imports EntityFrameworkCore.VisualBasic.Design
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.EntityFrameworkCore.Diagnostics
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Builders
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Scaffolding
-
-Namespace Scaffolding.Internal
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards As public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Class VisualBasicRuntimeModelCodeGenerator
- Implements ICompiledModelCodeGenerator
-
- Private ReadOnly _code As IVisualBasicHelper
- Private ReadOnly _annotationCodeGenerator As IVisualBasicRuntimeAnnotationCodeGenerator
-
- Private Const FileExtension = ".vb"
- Private Const ModelSuffix = "Model"
- Private Const ModelBuilderSuffix = "ModelBuilder"
- Private Const EntityTypeSuffix = "EntityType"
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards As public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Sub New(annotationCodeGenerator As IVisualBasicRuntimeAnnotationCodeGenerator,
- vbHelper As IVisualBasicHelper)
-
- _annotationCodeGenerator = NotNull(annotationCodeGenerator, NameOf(annotationCodeGenerator))
- _code = NotNull(vbHelper, NameOf(vbHelper))
- End Sub
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards As public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable ReadOnly Property Language As String Implements ILanguageBasedService.Language
- Get
- Return "VB"
- End Get
- End Property
-
- '''
- ''' This Is an internal API that supports the Entity Framework Core infrastructure And Not subject to
- ''' the same compatibility standards As public APIs. It may be changed Or removed without notice in
- ''' any release. You should only use it directly in your code with extreme caution And knowing that
- ''' doing so can result in application failures when updating to a New Entity Framework Core release.
- '''
- Public Overridable Function GenerateModel(model As IModel,
- options As CompiledModelCodeGenerationOptions) As IReadOnlyCollection(Of ScaffoldedFile) _
- Implements ICompiledModelCodeGenerator.GenerateModel
-
- NotNull(model, NameOf(model))
- NotNull(options, NameOf(options))
-
- Dim scaffoldedFiles As New List(Of ScaffoldedFile)
- Dim modelCode = CreateModel(options.ModelNamespace, options.ContextType)
- Dim modelFileName = options.ContextType.ShortDisplayName() & ModelSuffix & FileExtension
-
- scaffoldedFiles.Add(New ScaffoldedFile With {
- .Path = modelFileName,
- .Code = modelCode})
-
- Dim entityTypeIds As New Dictionary(Of IEntityType, (Variable As String, [Class] As String))
- Dim modelBuilderCode = CreateModelBuilder(model, options.ModelNamespace, options.ContextType, entityTypeIds)
- Dim modelBuilderFileName = options.ContextType.ShortDisplayName() & ModelBuilderSuffix & FileExtension
-
- scaffoldedFiles.Add(New ScaffoldedFile With {
- .Path = modelBuilderFileName,
- .Code = modelBuilderCode})
-
- For Each entityTypeId In entityTypeIds
- Dim entityType = entityTypeId.Key
- Dim namePair = entityTypeId.Value
-
- Dim generatedCode = GenerateEntityType(entityType, options.ModelNamespace, namePair.Class)
-
- Dim entityTypeFileName = namePair.Class & FileExtension
- scaffoldedFiles.Add(
- New ScaffoldedFile With {
- .Path = entityTypeFileName,
- .Code = generatedCode})
- Next
-
- Return scaffoldedFiles
- End Function
-
- Private Shared Function GenerateHeader(namespaces As SortedSet(Of String), currentNamespace As String) As String
-
- For i = 0 To currentNamespace.Length - 1
- If currentNamespace(i) <> "."c Then
- Continue For
- End If
- namespaces.Remove(currentNamespace.Substring(0, i))
- Next
-
- namespaces.Remove(currentNamespace)
-
- Dim builder = New StringBuilder()
- builder.AppendLine("' ")
-
- For Each [Namespace] In namespaces
- builder.
- Append("Imports ").
- AppendLine([Namespace])
- Next
-
- builder.AppendLine()
-
- Return builder.ToString()
- End Function
-
- Private Function CreateModel([namespace] As String,
- contextType As Type) As String
-
- Dim mainBuilder = New IndentedStringBuilder()
- Dim namespaces = New SortedSet(Of String)(New NamespaceComparer()) From {
- GetType(RuntimeModel).Namespace,
- GetType(DbContextAttribute).Namespace,
- "Microsoft.VisualBasic"
- }
-
- AddNamespace(contextType, namespaces)
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.
- Append("Namespace ").
- AppendLine(_code.Namespace([namespace]))
-
- mainBuilder.Indent()
- End If
-
- Dim className = _code.Identifier(contextType.ShortDisplayName()) & ModelSuffix
- mainBuilder.Append("").
- Append("Public Partial Class ").
- AppendLine(className)
-
- Using mainBuilder.Indent()
- mainBuilder.
- Append("Inherits ").AppendLine(NameOf(RuntimeModel)).
- AppendLine().
- AppendLine("Private Shared ReadOnly _useOldBehavior31751 As Boolean").
- AppendLine().
- Append("Private Shared ").Append("_Instance As ").AppendLine(className).
- AppendLine("Public Shared ReadOnly Property Instance As IModel").
- IncrementIndent.
- AppendLine("Get").
- IncrementIndent.
- AppendLine("Return _Instance").
- DecrementIndent.
- AppendLine("End Get").
- DecrementIndent.
- AppendLine("End Property").
- AppendLine().
- AppendLine("Shared Sub New()").
- IncrementIndent().
- AppendLine("Dim enabled31751 As Boolean").
- AppendLine("_useOldBehavior31751 = System.AppContext.TryGetSwitch(""Microsoft.EntityFrameworkCore.Issue31751"", enabled31751) AndAlso enabled31751").
- AppendLine().
- AppendLines(
-$"Dim model As New {className}()
-If _useOldBehavior31751 Then
- model.Initialize()
-Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
-End If
-
-model.Customize()
-_Instance = model").
- DecrementIndent().
- AppendLine("End Sub").
- AppendLine().
- AppendLine("Partial Private Sub Initialize()").
- AppendLine("End Sub").
- AppendLine().
- AppendLine("Partial Private Sub Customize()").
- AppendLine("End Sub")
- End Using
-
- mainBuilder.
- AppendLine("End Class")
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.DecrementIndent()
- mainBuilder.AppendLine("End Namespace")
- End If
-
- Return GenerateHeader(namespaces, [namespace]) & mainBuilder.ToString()
- End Function
-
- Private Function CreateModelBuilder(model As IModel,
- [namespace] As String,
- contextType As Type,
- entityTypeIds As Dictionary(Of IEntityType, (Variable As String, [Class] As String))) As String
-
- Dim mainBuilder = New IndentedStringBuilder()
- Dim methodBuilder = New IndentedStringBuilder()
- Dim namespaces = New SortedSet(Of String)(New NamespaceComparer()) From {
- GetType(RuntimeModel).Namespace,
- GetType(DbContextAttribute).Namespace,
- "Microsoft.VisualBasic"
- }
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.
- Append("Namespace ").
- AppendLine(_code.Namespace([namespace]))
-
- mainBuilder.Indent()
- End If
-
- Dim className = _code.Identifier(contextType.ShortDisplayName()) & ModelSuffix
- mainBuilder.
- Append("Public Partial Class ").
- AppendLine(className).
- AppendLine()
-
- Using mainBuilder.Indent()
- mainBuilder.
- AppendLine("Private Sub Initialize()")
-
- Using mainBuilder.Indent()
- Dim entityTypes = model.GetEntityTypesInHierarchicalOrder()
- Dim variables As New HashSet(Of String)
-
- Dim anyEntityTypes = False
- For Each entityType As IEntityType In entityTypes
- anyEntityTypes = True
- Dim variableName = _code.Identifier(entityType.ShortName(), variables, capitalize:=False)
-
- Dim firstChar = If(variableName(0) = "["c, variableName(1), variableName(0))
- Dim entityClassName = ""
-
- If firstChar = "_"c Then
- entityClassName = EntityTypeSuffix & variableName.Substring(1)
- Else
- Dim NewName = variableName
- If NewName(0) = "["c Then
- NewName = NewName.Substring(1, NewName.Length - 2)
- End If
- entityClassName = Char.ToUpperInvariant(firstChar) & NewName.Substring(1) & EntityTypeSuffix
- End If
-
- entityTypeIds(entityType) = (variableName, entityClassName)
-
- mainBuilder.
- Append("Dim ").
- Append(variableName).
- Append(" = ").
- Append(entityClassName).
- Append(".Create(Me")
-
- If entityType.BaseType IsNot Nothing Then
- mainBuilder.
- Append(", ").
- Append(entityTypeIds(entityType.BaseType).Variable)
- End If
-
- mainBuilder.
- AppendLine(")"c)
- Next
-
- If anyEntityTypes Then
- mainBuilder.AppendLine()
- End If
-
- Dim anyForeignKeys = False
- For Each entityTypeId In entityTypeIds
-
- Dim entityType = entityTypeId.Key
- Dim namePair = entityTypeId.Value
-
- Dim variableName = namePair.Variable
- Dim entityClassName = namePair.Class
-
- Dim foreignKeyNumber = 1
-
- For Each foreignKey As IForeignKey In entityType.GetDeclaredForeignKeys()
- anyForeignKeys = True
- Dim principalVariable = entityTypeIds(foreignKey.PrincipalEntityType).Variable
-
- mainBuilder.
- Append(entityClassName).
- Append(".CreateForeignKey").
- Append(foreignKeyNumber.ToString()).
- Append("("c).
- Append(variableName).
- Append(", ").
- Append(principalVariable).
- AppendLine(")"c)
-
- foreignKeyNumber += 1
- Next
- Next
-
- If anyForeignKeys Then
- mainBuilder.
- AppendLine()
- End If
-
- Dim anySkipNavigations = False
- For Each entityTypeId In entityTypeIds
-
- Dim entityType = entityTypeId.Key
- Dim namePair = entityTypeId.Value
-
- Dim variableName = namePair.Variable
- Dim entityClassName = namePair.Class
-
- Dim navigationNumber = 1
-
- For Each navigation As ISkipNavigation In entityType.GetDeclaredSkipNavigations()
- anySkipNavigations = True
- Dim targetVariable = entityTypeIds(navigation.TargetEntityType).Variable
- Dim joinVariable = entityTypeIds(navigation.JoinEntityType).Variable
-
- mainBuilder.
- Append(entityClassName).
- Append(".CreateSkipNavigation").
- Append(navigationNumber.ToString()).
- Append("("c).
- Append(variableName).
- Append(", ").
- Append(targetVariable).
- Append(", ").
- Append(joinVariable).
- AppendLine(")"c)
-
- navigationNumber += 1
- Next
- Next
-
- If anySkipNavigations Then
- mainBuilder.AppendLine()
- End If
-
- For Each entityTypeId In entityTypeIds
-
- Dim entityType = entityTypeId.Key
- Dim namePair = entityTypeId.Value
-
- Dim variableName = namePair.Variable
- Dim entityClassName = namePair.Class
-
- mainBuilder.
- Append(entityClassName).
- Append(".CreateAnnotations").
- Append("("c).
- Append(variableName).
- AppendLine(")"c)
- Next
-
- If anyEntityTypes Then
- mainBuilder.AppendLine()
- End If
-
- Dim parameters As New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- "Me",
- className,
- mainBuilder,
- methodBuilder,
- namespaces,
- variables)
-
- For Each typeConfiguration In model.GetTypeMappingConfigurations()
- Create(typeConfiguration, parameters)
- Next
-
- CreateAnnotations(model, AddressOf _annotationCodeGenerator.Generate, parameters)
-
- End Using
-
- mainBuilder.
- AppendLine("End Sub")
-
- Dim methods = methodBuilder.ToString()
- If Not String.IsNullOrEmpty(methods) Then
- mainBuilder.
- AppendLine().
- AppendLines(methods)
- End If
- End Using
-
- mainBuilder.
- AppendLine("End Class")
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.DecrementIndent()
- mainBuilder.AppendLine("End Namespace")
- End If
-
- Return GenerateHeader(namespaces, [namespace]) & mainBuilder.ToString
- End Function
-
- Private Sub Create(typeConfiguration As ITypeMappingConfiguration,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim variableName = _code.Identifier("typeConfig", parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.Append("Dim ").Append(variableName).Append(" = ").Append(parameters.TargetName).AppendLine(".AddTypeMappingConfiguration(").
- IncrementIndent().
- Append(_code.Literal(typeConfiguration.ClrType))
-
- AddNamespace(typeConfiguration.ClrType, parameters.Namespaces)
-
- If typeConfiguration.GetMaxLength().HasValue Then
- mainBuilder.AppendLine(","c).
- Append("maxLength:=").
- Append(_code.Literal(typeConfiguration.GetMaxLength()))
- End If
-
- If typeConfiguration.IsUnicode().HasValue Then
- mainBuilder.AppendLine(","c).
- Append("unicode:=").
- Append(_code.Literal(typeConfiguration.IsUnicode()))
- End If
-
- If typeConfiguration.GetPrecision().HasValue Then
- mainBuilder.AppendLine(","c).
- Append("precision:=").
- Append(_code.Literal(typeConfiguration.GetPrecision()))
- End If
-
- If typeConfiguration.GetScale().HasValue Then
- mainBuilder.AppendLine(","c).
- Append("scale:=").
- Append(_code.Literal(typeConfiguration.GetScale()))
- End If
-
- Dim providerClrType = typeConfiguration.GetProviderClrType()
- If providerClrType IsNot Nothing Then
- AddNamespace(providerClrType, parameters.Namespaces)
-
- mainBuilder.AppendLine(","c).
- Append("providerPropertyType:=").
- Append(_code.Literal(providerClrType))
- End If
-
- Dim valueConverterType = CType(typeConfiguration(CoreAnnotationNames.ValueConverterType), Type)
- If valueConverterType IsNot Nothing Then
- AddNamespace(valueConverterType, parameters.Namespaces)
-
- mainBuilder.AppendLine(","c).
- Append("valueConverter:=New ").
- Append(_code.Reference(valueConverterType)).
- Append("()")
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(
- typeConfiguration,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(variableName).
- Clone())
-
- mainBuilder.AppendLine()
- End Sub
-
- Private Function GenerateEntityType(entityType As IEntityType, [namespace] As String, className As String) As String
- Dim mainBuilder As New IndentedStringBuilder()
- Dim methodBuilder As New IndentedStringBuilder()
- Dim namespaces As New SortedSet(Of String)(New NamespaceComparer()) From {
- GetType(BindingFlags).Namespace,
- GetType(MethodInfo).Namespace,
- GetType(RuntimeEntityType).Namespace,
- "Microsoft.VisualBasic"
- }
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.
- Append("Namespace ").
- AppendLine(_code.Namespace([namespace]))
-
- mainBuilder.Indent()
- End If
-
- mainBuilder.
- Append("Friend Partial Class ").
- AppendLine(className).
- AppendLine()
-
- Using mainBuilder.Indent()
- CreateEntityType(entityType, mainBuilder, methodBuilder, namespaces, className)
-
- For Each complexProperty In entityType.GetDeclaredComplexProperties()
- CreateComplexProperty(complexProperty, mainBuilder, methodBuilder, namespaces, className)
- Next
-
- Dim foreignKeyNumber = 1
- For Each foreignKey As IForeignKey In entityType.GetDeclaredForeignKeys()
- CreateForeignKey(foreignKey, foreignKeyNumber, mainBuilder, methodBuilder, namespaces, className)
- foreignKeyNumber += 1
- Next
-
- Dim navigationNumber = 1
- For Each navigation As ISkipNavigation In entityType.GetDeclaredSkipNavigations()
- CreateSkipNavigation(navigation, navigationNumber, mainBuilder, methodBuilder, namespaces, className)
- navigationNumber += 1
- Next
-
- CreateAnnotations(entityType,
- mainBuilder,
- methodBuilder,
- namespaces,
- className)
- End Using
-
- mainBuilder.AppendLine("End Class")
-
- If Not String.IsNullOrEmpty([namespace]) Then
- mainBuilder.DecrementIndent()
- mainBuilder.AppendLine("End Namespace")
- End If
-
- Return GenerateHeader(namespaces, [namespace]) & mainBuilder.ToString() & methodBuilder.ToString()
- End Function
-
- Private Sub CreateEntityType(entityType As IEntityType,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As SortedSet(Of String),
- className As String)
-
- mainBuilder.
- Append("Public Shared Function Create").
- Append("(model As RuntimeModel, ").
- AppendLine("Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType")
-
- Using mainBuilder.Indent()
-
- Const entityTypeVariable = "entityType"
- Dim variables = New HashSet(Of String) From {
- "model",
- "baseEntityType",
- entityTypeVariable
- }
-
- Dim parameters = New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- entityTypeVariable,
- className,
- mainBuilder,
- methodBuilder,
- namespaces,
- variables)
-
- Create(entityType, parameters)
-
- Dim propertyVariables As New Dictionary(Of IProperty, String)
- For Each prop In entityType.GetDeclaredProperties()
- Create(prop, propertyVariables, parameters)
- Next
-
- For Each prop In entityType.GetDeclaredServiceProperties()
- Create(prop, parameters)
- Next
-
- For Each complexProperty In entityType.GetDeclaredComplexProperties()
- mainBuilder.
- Append(_code.Identifier(complexProperty.Name, capitalize:=True)).
- Append("ComplexProperty").
- Append(".Create").
- Append("("c).
- Append(entityTypeVariable).
- AppendLine(")"c)
- Next
-
- For Each aKey In entityType.GetDeclaredKeys()
- Create(aKey, propertyVariables, parameters)
- Next
-
- For Each index In entityType.GetDeclaredIndexes()
- Create(index, propertyVariables, parameters)
- Next
-
- For Each trigger In entityType.GetDeclaredTriggers()
- Create(trigger, parameters)
- Next
-
- mainBuilder.
- Append("Return ").
- AppendLine(entityTypeVariable)
- End Using
-
- mainBuilder.
- AppendLine("End Function")
- End Sub
-
- Private Sub Create(entityType As IEntityType,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim runTimeEntityType = TryCast(entityType, IRuntimeEntityType)
-
- If (runTimeEntityType.ConstructorBinding IsNot Nothing AndAlso
- ((runTimeEntityType?.GetConstructorBindingConfigurationSource()).OverridesStrictly(ConfigurationSource.Convention) OrElse
- TypeOf runTimeEntityType.ConstructorBinding Is FactoryMethodBinding)) OrElse
- (runTimeEntityType?.ServiceOnlyConstructorBinding IsNot Nothing AndAlso
- (runTimeEntityType.GetServiceOnlyConstructorBindingConfigurationSource().OverridesStrictly(ConfigurationSource.Convention) OrElse
- TypeOf runTimeEntityType.ServiceOnlyConstructorBinding Is FactoryMethodBinding)) Then
-
- Throw New InvalidOperationException(DesignStrings.CompiledModelConstructorBinding(
- runTimeEntityType.ShortName(), "Customize()", parameters.ClassName))
- End If
-
- If runTimeEntityType.GetQueryFilter() IsNot Nothing Then
- Throw New InvalidOperationException(DesignStrings.CompiledModelQueryFilter(runTimeEntityType.ShortName()))
- End If
-
-#Disable Warning BC40000 ' Type or member is obsolete
- If runTimeEntityType.GetDefiningQuery() IsNot Nothing Then
- Throw New InvalidOperationException(DesignStrings.CompiledModelDefiningQuery(runTimeEntityType.ShortName()))
- End If
-#Enable Warning BC40000 ' Type or member is obsolete
-
- AddNamespace(runTimeEntityType.ClrType, parameters.Namespaces)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(parameters.TargetName).
- AppendLine(" = model.AddEntityType(").
- IncrementIndent().
- Append(_code.Literal(runTimeEntityType.Name)).
- AppendLine(","c).
- Append(_code.Literal(runTimeEntityType.ClrType)).
- AppendLine(","c).
- Append("baseEntityType")
-
- If runTimeEntityType.HasSharedClrType Then
- mainBuilder.
- AppendLine(","c).
- Append("sharedClrType:=").
- Append(_code.Literal(runTimeEntityType.HasSharedClrType))
- End If
-
- Dim discriminatorProperty = runTimeEntityType.GetDiscriminatorPropertyName()
-
- If discriminatorProperty IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("discriminatorProperty:=").
- Append(_code.Literal(discriminatorProperty))
- End If
-
- Dim changeTrackingStrat As ChangeTrackingStrategy = runTimeEntityType.GetChangeTrackingStrategy()
-
- If changeTrackingStrat <> ChangeTrackingStrategy.Snapshot Then
- parameters.Namespaces.Add(GetType(ChangeTrackingStrategy).Namespace)
-
- mainBuilder.
- AppendLine(","c).
- Append("changeTrackingStrategy:=").
- Append(_code.Literal(CType(changeTrackingStrat, [Enum])))
- End If
-
- Dim indexerPropertyInfo = runTimeEntityType.FindIndexerPropertyInfo()
-
- If indexerPropertyInfo IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(").
- Append(_code.Literal(runTimeEntityType.ClrType)).
- Append(")"c)
- End If
-
- If runTimeEntityType.IsPropertyBag Then
- mainBuilder.
- AppendLine(","c).
- Append("propertyBag:=").
- Append(_code.Literal(True))
- End If
-
- Dim discriminatorValue = entityType.GetDiscriminatorValue()
- If discriminatorValue IsNot Nothing Then
- AddNamespace(discriminatorValue.GetType(), parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("discriminatorValue:=").
- Append(_code.UnknownLiteral(discriminatorValue))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- AppendLine().
- DecrementIndent()
- End Sub
-
- Private Sub Create([property] As IProperty,
- propertyVariables As Dictionary(Of IProperty, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim variableName = _code.Identifier([property].Name, parameters.ScopeVariables, capitalize:=False)
- propertyVariables([property]) = variableName
-
- Create([property], variableName, propertyVariables, parameters)
-
- CreateAnnotations([property],
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(variableName).
- Clone)
-
- parameters.MainBuilder.AppendLine()
- End Sub
-
- Private Sub Create([property] As IProperty,
- variableName As String,
- propertyVariables As Dictionary(Of IProperty, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim valueGeneratorFactoryType = TryCast([property](CoreAnnotationNames.ValueGeneratorFactoryType), Type)
-
- If valueGeneratorFactoryType Is Nothing AndAlso
- [property].GetValueGeneratorFactory() IsNot Nothing Then
- Throw New InvalidOperationException(
- DesignStrings.CompiledModelValueGenerator(
- [property].DeclaringType.ShortName(), [property].Name, NameOf(PropertyBuilder.HasValueGeneratorFactory)))
- End If
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(variableName).
- Append(" = ").
- Append(parameters.TargetName).
- AppendLine(".AddProperty(").
- IncrementIndent().
- Append(_code.Literal([property].Name))
-
- PropertyBaseParameters([property], parameters)
-
- If [property].IsNullable Then
- mainBuilder.
- AppendLine(","c).
- Append("nullable:=").
- Append(_code.Literal(True))
- End If
-
- If [property].IsConcurrencyToken Then
- mainBuilder.
- AppendLine(","c).
- Append("concurrencyToken:=").
- Append(_code.Literal(True))
- End If
-
- If [property].ValueGenerated <> ValueGenerated.Never Then
- mainBuilder.
- AppendLine(","c).
- Append("valueGenerated:=").
- Append(_code.Literal(CType([property].ValueGenerated, [Enum])))
- End If
-
- If [property].GetBeforeSaveBehavior() <> PropertySaveBehavior.Save Then
- mainBuilder.
- AppendLine(","c).
- Append("beforeSaveBehavior:=").
- Append(_code.Literal(CType([property].GetBeforeSaveBehavior(), [Enum])))
- End If
-
- If [property].GetAfterSaveBehavior() <> PropertySaveBehavior.Save Then
- mainBuilder.
- AppendLine(","c).
- Append("afterSaveBehavior:=").
- Append(_code.Literal(CType([property].GetAfterSaveBehavior(), [Enum])))
- End If
-
- If [property].GetMaxLength().HasValue Then
- mainBuilder.
- AppendLine(","c).
- Append("maxLength:=").
- Append(_code.Literal([property].GetMaxLength()))
- End If
-
- If [property].IsUnicode().HasValue Then
- mainBuilder.
- AppendLine(","c).
- Append("unicode:=").
- Append(_code.Literal([property].IsUnicode()))
- End If
-
- If [property].GetPrecision().HasValue Then
- mainBuilder.
- AppendLine(","c).
- Append("precision:=").
- Append(_code.Literal([property].GetPrecision()))
- End If
-
- If [property].GetScale().HasValue Then
- mainBuilder.
- AppendLine(","c).
- Append("scale:=").
- Append(_code.Literal([property].GetScale()))
- End If
-
- Dim providerClrType = [property].GetProviderClrType()
-
- If providerClrType IsNot Nothing Then
- AddNamespace(providerClrType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("providerPropertyType:=").
- Append(_code.Literal(providerClrType))
- End If
-
- If valueGeneratorFactoryType IsNot Nothing Then
- AddNamespace(valueGeneratorFactoryType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("valueGeneratorFactory:=AddressOf New ").
- Append(_code.Reference(valueGeneratorFactoryType)).
- Append("().Create")
- End If
-
- Dim valueConverterType = GetValueConverterType([property])
- If valueConverterType IsNot Nothing Then
- AddNamespace(valueConverterType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("valueConverter:=New ").
- Append(_code.Reference(valueConverterType)).
- Append("()")
- End If
-
- Dim valueComparerType = DirectCast([property](CoreAnnotationNames.ValueComparerType), Type)
- If valueComparerType IsNot Nothing Then
- AddNamespace(valueComparerType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("valueComparer:=New ").
- Append(_code.Reference(valueComparerType)).
- Append("()")
- End If
-
- Dim providerValueComparerType = DirectCast([property](CoreAnnotationNames.ProviderValueComparerType), Type)
- If providerValueComparerType IsNot Nothing Then
- AddNamespace(providerValueComparerType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("providerValueComparer:=New ").
- Append(_code.Reference(providerValueComparerType)).
- Append("()")
- End If
-
- Dim sentinel = [property].Sentinel
- Dim converter = [property].FindTypeMapping()?.Converter
- If sentinel IsNot Nothing AndAlso
- converter Is Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("sentinel:=").
- Append(_code.UnknownLiteral(sentinel))
- End If
-
- Dim jsonValueReaderWriterType = CType([property](CoreAnnotationNames.JsonValueReaderWriterType), Type)
- If jsonValueReaderWriterType IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("jsonValueReaderWriter:=")
-
- VisualBasicRuntimeAnnotationCodeGenerator.CreateJsonValueReaderWriter(jsonValueReaderWriterType, parameters, _code)
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- mainBuilder.
- Append(variableName).
- Append(".TypeMapping = ")
-
- _annotationCodeGenerator.Create(
- [property].GetTypeMapping(),
- [property],
- parameters.
- Cloner.
- WithTargetName(variableName).
- Clone())
-
- mainBuilder.AppendLine()
-
- If sentinel IsNot Nothing AndAlso
- converter IsNot Nothing Then
- mainBuilder.
- Append(variableName).Append(".SetSentinelFromProviderValue(").
- Append(_code.UnknownLiteral(If(converter?.ConvertToProvider(sentinel), sentinel))).
- AppendLine(")")
- End If
- End Sub
-
- Private Shared Function GetValueConverterType([property] As IProperty) As Type
- Dim annotation = [property].FindAnnotation(CoreAnnotationNames.ValueConverterType)
-
- If annotation IsNot Nothing Then
- Return DirectCast(annotation.Value, Type)
- End If
-
- If Not Metadata.Internal.[Property].UseOldBehavior32422 Then
- Return DirectCast([property], [Property]).
- GetConversion(throwOnProviderClrTypeConflict:=False, throwOnValueConverterConflict:=False).
- ValueConverterType
- End If
-
- Dim principalProperty = [property]
-
- Dim i = 0
- While i < ForeignKey.LongestFkChainAllowedLength
- Dim nextProperty As IProperty = Nothing
- For Each foreignKey In principalProperty.GetContainingForeignKeys()
- For propertyIndex = 0 To foreignKey.Properties.Count - 1
- If principalProperty Is foreignKey.Properties(propertyIndex) Then
- Dim newPrincipalProperty = foreignKey.PrincipalKey.Properties(propertyIndex)
- If newPrincipalProperty Is [property] OrElse
- newPrincipalProperty Is principalProperty Then
-
- Exit For
- End If
-
- annotation = newPrincipalProperty.FindAnnotation(CoreAnnotationNames.ValueConverterType)
- If annotation IsNot Nothing Then
- Return DirectCast(annotation.Value, Type)
- End If
-
- nextProperty = newPrincipalProperty
- End If
- Next
- Next
-
- If nextProperty Is Nothing Then
- Exit While
- End If
-
- principalProperty = nextProperty
- i += 1
- End While
-
- If i = ForeignKey.LongestFkChainAllowedLength Then
- Throw New InvalidOperationException(
- CoreStrings.RelationshipCycle(
- [property].DeclaringType.DisplayName(), [property].Name, "ValueConverterType"))
- Else
- Return Nothing
- End If
- End Function
-
- Private Sub PropertyBaseParameters(prop As IPropertyBase,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters,
- Optional skipType As Boolean = False)
-
- Dim mainBuilder = parameters.MainBuilder
-
- If Not skipType Then
- AddNamespace(prop.ClrType, parameters.Namespaces)
- mainBuilder.
- AppendLine(","c).
- Append(_code.Literal(prop.ClrType))
- End If
-
- Dim propertyInfo = prop.PropertyInfo
-
- If propertyInfo IsNot Nothing Then
-
- AddNamespace(propertyInfo.DeclaringType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("propertyInfo:=")
-
- If prop.IsIndexerProperty() Then
- mainBuilder.
- Append(parameters.TargetName).
- Append(".FindIndexerPropertyInfo()")
- Else
- mainBuilder.
- Append(_code.Literal(propertyInfo.DeclaringType)).
- Append(".GetProperty(").
- Append(_code.Literal(propertyInfo.Name)).
- Append(", ").
- Append(If(propertyInfo.GetAccessors().Length <> 0, "BindingFlags.Public", "BindingFlags.NonPublic")).
- Append(If(propertyInfo.IsStatic(), " Or BindingFlags.Static", " Or BindingFlags.Instance")).
- Append(" Or BindingFlags.DeclaredOnly)")
- End If
- End If
-
- Dim fieldInfo = prop.FieldInfo
-
- If fieldInfo IsNot Nothing Then
-
- AddNamespace(fieldInfo.DeclaringType, parameters.Namespaces)
-
- mainBuilder.
- AppendLine(","c).
- Append("fieldInfo:=").
- Append(_code.Literal(fieldInfo.DeclaringType)).
- Append(".GetField(").
- Append(_code.Literal(fieldInfo.Name)).
- Append(", ").
- Append(If(fieldInfo.IsPublic, "BindingFlags.Public", "BindingFlags.NonPublic")).
- Append(If(fieldInfo.IsStatic, " Or BindingFlags.Static", " Or BindingFlags.Instance")).
- Append(" Or BindingFlags.DeclaredOnly)")
- End If
-
- Dim propertyAccessMode = prop.GetPropertyAccessMode()
-
- If propertyAccessMode <> Model.DefaultPropertyAccessMode Then
- parameters.Namespaces.Add(GetType(PropertyAccessMode).Namespace)
-
- mainBuilder.
- AppendLine(","c).
- Append("propertyAccessMode:=").
- Append(_code.Literal(CType(propertyAccessMode, [Enum])))
- End If
- End Sub
-
- Private Sub FindProperties(entityTypeVariable As String,
- properties As IEnumerable(Of IProperty),
- mainBuilder As IndentedStringBuilder,
- Optional propertyVariables As Dictionary(Of IProperty, String) = Nothing)
-
- mainBuilder.Append("{"c)
-
- Dim first = True
-
- For Each prop In properties
- If first Then
- first = False
- Else
- mainBuilder.
- Append(", ")
- End If
-
- Dim propertyVariable As String = Nothing
-
- If propertyVariables IsNot Nothing AndAlso
- propertyVariables.TryGetValue(prop, propertyVariable) Then
-
- mainBuilder.
- Append(propertyVariable)
- Else
- mainBuilder.
- Append(entityTypeVariable).
- Append(".FindProperty(").
- Append(_code.Literal(prop.Name)).
- Append(")"c)
- End If
- Next
-
- mainBuilder.Append("}"c)
- End Sub
-
- Private Sub Create([property] As IServiceProperty,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim variableName = _code.Identifier([property].Name, parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(variableName).
- Append(" = ").
- Append(parameters.TargetName).
- AppendLine(".AddServiceProperty(").
- IncrementIndent().
- Append(_code.Literal([property].Name))
-
- PropertyBaseParameters([property], parameters, skipType:=True)
-
- AddNamespace([property].ClrType, parameters.Namespaces)
- mainBuilder.
- AppendLine(","c).
- Append("serviceType:=GetType(" & _code.Reference([property].ClrType) & ")")
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations([property],
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(variableName).
- Clone())
-
- mainBuilder.
- AppendLine()
- End Sub
-
- Private Sub Create(key As IKey,
- propertyVariables As Dictionary(Of IProperty, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim variableName = _code.Identifier("key", parameters.ScopeVariables)
- Dim mainBuilder = parameters.MainBuilder
-
- mainBuilder.
- Append("Dim ").
- Append(variableName).
- Append(" = ").
- Append(parameters.TargetName).
- AppendLine(".AddKey(").
- IncrementIndent()
-
- FindProperties(parameters.TargetName, key.Properties, mainBuilder, propertyVariables)
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- If key.IsPrimaryKey() Then
- mainBuilder.
- Append(parameters.TargetName).
- Append(".SetPrimaryKey(").
- Append(variableName).
- AppendLine(")"c)
- End If
-
- CreateAnnotations(key,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(variableName).
- Clone())
-
- mainBuilder.
- AppendLine()
- End Sub
-
- Private Sub Create(index As IIndex,
- propertyVariables As Dictionary(Of IProperty, String),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim variableName = _code.Identifier(If(index.Name, "index"), parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append("Dim ").
- Append(variableName).
- Append(" = ").
- Append(parameters.TargetName).
- AppendLine(".AddIndex(").
- IncrementIndent()
-
- FindProperties(parameters.TargetName, index.Properties, mainBuilder, propertyVariables)
-
- If index.Name IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("name:=").
- Append(_code.Literal(index.Name))
- End If
-
- If index.IsUnique Then
- mainBuilder.
- AppendLine(","c).
- Append("unique:=").
- Append(_code.Literal(True))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(index,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(variableName).
- Clone())
-
- mainBuilder.
- AppendLine()
- End Sub
-
- Private Sub CreateComplexProperty(complexProperty As IComplexProperty,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As SortedSet(Of String),
- topClassName As String)
-
- mainBuilder.
- AppendLine().
- Append("Private Class ").
- Append(_code.Identifier(complexProperty.Name, capitalize:=True)).
- AppendLine("ComplexProperty")
-
- Dim complexType = complexProperty.ComplexType
- Using mainBuilder.Indent()
- Dim declaringTypeVariable = "declaringType"
- mainBuilder.
- Append("Public Shared Function Create(").
- Append(declaringTypeVariable).
- Append(" As ").
- Append(If(TypeOf complexProperty.DeclaringType Is IEntityType, "RuntimeEntityType", "RuntimeComplexType")).
- AppendLine(") As RuntimeComplexProperty")
-
- Using mainBuilder.Indent()
- Const complexPropertyVariable = "complexProperty"
- Const complexTypeVariable = "complexType"
-
- Dim variables As New HashSet(Of String) From {
- declaringTypeVariable,
- complexPropertyVariable,
- complexTypeVariable
- }
-
- mainBuilder.
- Append("Dim ").
- Append(complexPropertyVariable).
- Append(" = ").
- Append(declaringTypeVariable).
- Append(".AddComplexProperty(").
- IncrementIndent().
- Append(_code.Literal(complexProperty.Name)).
- AppendLine(","c).
- Append(_code.Literal(complexProperty.ClrType)).
- AppendLine(","c).
- Append(_code.Literal(complexType.Name)).
- AppendLine(","c).
- Append(_code.Literal(complexType.ClrType))
-
- AddNamespace(complexProperty.ClrType, namespaces)
- AddNamespace(complexType.ClrType, namespaces)
-
- Dim parameters As New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- declaringTypeVariable,
- topClassName,
- mainBuilder,
- methodBuilder,
- namespaces,
- variables)
-
- PropertyBaseParameters(complexProperty, parameters, skipType:=True)
-
- If complexProperty.IsNullable Then
- mainBuilder.
- AppendLine(","c).
- Append("nullable:=").
- Append(_code.Literal(True))
- End If
-
- If complexProperty.IsCollection Then
- mainBuilder.
- AppendLine(","c).
- Append("collection:=").
- Append(_code.Literal(True))
- End If
-
- Dim changeTrackingStrategy = complexType.GetChangeTrackingStrategy()
- If changeTrackingStrategy <> ChangeTrackingStrategy.Snapshot Then
- namespaces.Add(GetType(ChangeTrackingStrategy).Namespace)
-
- mainBuilder.AppendLine(","c).
- Append("changeTrackingStrategy:=").
- Append(_code.Literal(DirectCast(changeTrackingStrategy, [Enum])))
- End If
-
- Dim indexerPropertyInfo = complexType.FindIndexerPropertyInfo()
- If indexerPropertyInfo IsNot Nothing Then
- mainBuilder.
- AppendLine(","c).
- Append("indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(").
- Append(_code.Literal(complexType.ClrType)).
- Append(")"c)
- End If
-
- If complexType.IsPropertyBag Then
- mainBuilder.AppendLine(","c).
- Append("propertyBag:=").
- Append(_code.Literal(True))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- AppendLine().
- DecrementIndent()
-
- mainBuilder.
- Append("Dim ").Append(complexTypeVariable).Append(" = ").
- Append(complexPropertyVariable).AppendLine(".ComplexType")
-
- Dim complexTypeParameters = parameters.Cloner.WithTargetName(complexTypeVariable).Clone
- Dim propertyVariables As New Dictionary(Of IProperty, String)()
-
- For Each [property] In complexType.GetProperties()
- Create([property], propertyVariables, complexTypeParameters)
- Next
-
- For Each nestedComplexProperty In complexType.GetComplexProperties()
- mainBuilder.
- Append(_code.Identifier(nestedComplexProperty.Name, capitalize:=True)).
- Append("ComplexProperty").
- Append(".Create").
- Append("("c).
- Append(complexTypeVariable).
- AppendLine(")"c)
- Next
-
- CreateAnnotations(
- complexType,
- AddressOf _annotationCodeGenerator.Generate,
- complexTypeParameters)
-
- CreateAnnotations(
- complexProperty,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.WithTargetName(complexPropertyVariable).Clone())
-
- mainBuilder.
- Append("Return ").
- AppendLine(complexPropertyVariable)
- End Using
-
- mainBuilder.AppendLine("End Function")
- End Using
-
- Using mainBuilder.Indent()
- For Each nestedComplexProperty In complexType.GetComplexProperties()
- CreateComplexProperty(nestedComplexProperty, mainBuilder, methodBuilder, namespaces, topClassName)
- Next
- End Using
-
- mainBuilder.AppendLine("End Class")
- End Sub
-
- Private Sub CreateForeignKey(aforeignKey As IForeignKey,
- foreignKeyNumber As Integer,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As SortedSet(Of String),
- className As String)
-
- Const declaringEntityType = "declaringEntityType"
- Const principalEntityType = "principalEntityType"
-
- mainBuilder.
- AppendLine().
- Append("Public Shared Function CreateForeignKey").
- Append(foreignKeyNumber.ToString()).
- Append("("c).
- Append(declaringEntityType).
- Append(" As RuntimeEntityType").
- Append(", ").
- Append(principalEntityType).
- Append(" As RuntimeEntityType").
- AppendLine(") As RuntimeForeignKey")
-
- Using mainBuilder.Indent()
- Const foreignKeyVariable = "runtimeForeignKey"
-
- Dim variables = New HashSet(Of String) From {
- declaringEntityType,
- principalEntityType,
- foreignKeyVariable
- }
-
- mainBuilder.
- Append("Dim ").
- Append(foreignKeyVariable).Append(" = ").
- Append(declaringEntityType).
- Append(".AddForeignKey(").
- IncrementIndent()
-
- FindProperties(declaringEntityType, aforeignKey.Properties, mainBuilder)
-
- mainBuilder.
- AppendLine(","c).
- Append(principalEntityType).
- Append(".FindKey(")
-
- FindProperties(principalEntityType, aforeignKey.PrincipalKey.Properties, mainBuilder)
- mainBuilder.Append(")"c)
-
- mainBuilder.
- AppendLine(","c).
- Append(principalEntityType)
-
- If aforeignKey.DeleteBehavior <> ForeignKey.DefaultDeleteBehavior Then
- namespaces.Add(GetType(DeleteBehavior).Namespace)
-
- mainBuilder.
- AppendLine(","c).
- Append("deleteBehavior:=").
- Append(_code.Literal(CType(aforeignKey.DeleteBehavior, [Enum])))
- End If
-
- If aforeignKey.IsUnique Then
- mainBuilder.
- AppendLine(","c).
- Append("unique:=").
- Append(_code.Literal(True))
- End If
-
- If aforeignKey.IsRequired Then
- mainBuilder.
- AppendLine(","c).
- Append("required:=").
- Append(_code.Literal(True))
- End If
-
- If aforeignKey.IsRequiredDependent Then
- mainBuilder.
- AppendLine(","c).
- Append("requiredDependent:=").
- Append(_code.Literal(True))
- End If
-
- If aforeignKey.IsOwnership Then
- mainBuilder.
- AppendLine(","c).
- Append("ownership:=").
- Append(_code.Literal(True))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- AppendLine().
- DecrementIndent()
-
- Dim parameters = New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- foreignKeyVariable,
- className,
- mainBuilder,
- methodBuilder,
- namespaces,
- variables)
-
- Dim navigation = aforeignKey.DependentToPrincipal
-
- If navigation IsNot Nothing Then
- Create(navigation,
- foreignKeyVariable,
- parameters.Cloner.
- WithTargetName(declaringEntityType).
- Clone())
- End If
-
- navigation = aforeignKey.PrincipalToDependent
- If navigation IsNot Nothing Then
- Create(navigation,
- foreignKeyVariable,
- parameters.Cloner.
- WithTargetName(principalEntityType).
- Clone())
- End If
-
- CreateAnnotations(aforeignKey,
- AddressOf _annotationCodeGenerator.Generate,
- parameters)
-
- mainBuilder.
- Append("Return ").
- AppendLine(foreignKeyVariable)
- End Using
-
- mainBuilder.
- AppendLine("End Function")
- End Sub
-
- Private Sub Create(navigation As INavigation,
- foreignKeyVariable As String,
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim mainBuilder = parameters.MainBuilder
- Dim navigationVariable = _code.Identifier(navigation.Name, parameters.ScopeVariables, capitalize:=False)
-
- mainBuilder.
- Append("Dim ").
- Append(navigationVariable).
- Append(" = ").
- Append(parameters.TargetName).
- Append(".AddNavigation(").
- IncrementIndent().
- Append(_code.Literal(navigation.Name)).
- AppendLine(","c).
- Append(foreignKeyVariable).
- AppendLine(","c).
- Append("onDependent:=").
- Append(_code.Literal(navigation.IsOnDependent))
-
- PropertyBaseParameters(navigation, parameters)
-
- If navigation.IsEagerLoaded Then
- mainBuilder.
- AppendLine(","c).
- Append("eagerLoaded:=").
- Append(_code.Literal(True))
- End If
-
- If Not navigation.LazyLoadingEnabled Then
- mainBuilder.
- AppendLine(","c).
- Append("lazyLoadingEnabled:=").
- Append(_code.Literal(False))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- AppendLine().
- DecrementIndent()
-
- CreateAnnotations(navigation,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(navigationVariable).
- Clone())
- End Sub
-
- Private Sub CreateSkipNavigation(navigation As ISkipNavigation,
- navigationNumber As Integer,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As SortedSet(Of String),
- className As String)
-
- Const declaringEntityType = "declaringEntityType"
- Const targetEntityType = "targetEntityType"
- Const joinEntityType = "joinEntityType"
-
- mainBuilder.
- AppendLine().
- Append("Public Shared Function CreateSkipNavigation").
- Append(navigationNumber.ToString()).
- Append("("c).Append(declaringEntityType).Append(" As RuntimeEntityType").
- Append(", ").Append(targetEntityType).Append(" As RuntimeEntityType").
- Append(", ").Append(joinEntityType).Append(" As RuntimeEntityType").
- Append(")"c).
- AppendLine(" As RuntimeSkipNavigation")
-
- Using mainBuilder.Indent()
-
- Const navigationVariable = "skipNavigation"
- Dim variables = New HashSet(Of String) From {
- declaringEntityType,
- targetEntityType,
- joinEntityType,
- navigationVariable
- }
-
- Dim parameters = New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- targetName:=navigationVariable,
- className,
- mainBuilder,
- methodBuilder,
- namespaces,
- scopeVariables:=variables)
-
- mainBuilder.
- Append("Dim ").Append(navigationVariable).
- Append(" = ").
- Append(declaringEntityType).
- AppendLine(".AddSkipNavigation(").
- IncrementIndent().
- Append(_code.Literal(navigation.Name)).
- AppendLine(","c).
- Append(targetEntityType).
- AppendLine(","c).
- Append(joinEntityType).
- AppendLine(".FindForeignKey(")
-
- Using mainBuilder.Indent()
- FindProperties(joinEntityType, navigation.ForeignKey.Properties, mainBuilder)
-
- mainBuilder.
- AppendLine(","c).
- Append(declaringEntityType).
- Append(".FindKey(")
-
- FindProperties(declaringEntityType, navigation.ForeignKey.PrincipalKey.Properties, mainBuilder)
- mainBuilder.Append(")"c)
-
- mainBuilder.
- AppendLine(","c).
- Append(declaringEntityType).
- Append(")"c)
- End Using
-
- mainBuilder.
- AppendLine(","c).
- Append(_code.Literal(navigation.IsCollection)).AppendLine(","c).
- Append(_code.Literal(navigation.IsOnDependent))
-
- PropertyBaseParameters(navigation, parameters.Cloner.
- WithTargetName(declaringEntityType).
- Clone())
-
- If navigation.IsEagerLoaded Then
- mainBuilder.
- AppendLine(","c).
- Append("eagerLoaded:=").
- Append(_code.Literal(True))
- End If
-
- If Not navigation.LazyLoadingEnabled Then
- mainBuilder.
- AppendLine(","c).
- Append("lazyLoadingEnabled:=").
- Append(_code.Literal(False))
- End If
-
- mainBuilder.
- AppendLine(")"c).
- DecrementIndent()
-
- mainBuilder.AppendLine()
-
- variables.Add("inverse")
-
- mainBuilder.
- Append("Dim inverse = ").Append(targetEntityType).Append(".FindSkipNavigation(").
- Append(_code.Literal(navigation.Inverse.Name)).AppendLine(")"c).
- AppendLine("If inverse IsNot Nothing Then")
-
- Using mainBuilder.Indent()
- mainBuilder.
- Append(navigationVariable).
- AppendLine(".Inverse = inverse").
- Append("inverse.Inverse = ").AppendLine(navigationVariable)
- End Using
-
- mainBuilder.
- AppendLine("End If").
- AppendLine()
-
- CreateAnnotations(navigation,
- AddressOf _annotationCodeGenerator.Generate,
- parameters)
-
- mainBuilder.
- Append("Return ").
- AppendLine(navigationVariable)
- End Using
-
- mainBuilder.
- AppendLine("End Function")
- End Sub
-
- Private Sub Create(trigger As ITrigger, parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- Dim triggerVariable = _code.Identifier(trigger.ModelName, parameters.ScopeVariables, capitalize:=False)
-
- Dim mainBuilder = parameters.MainBuilder
- mainBuilder.
- Append("Dim ").Append(triggerVariable).Append(" = ").Append(parameters.TargetName).AppendLine(".AddTrigger(").
- IncrementIndent().
- Append(_code.Literal(trigger.ModelName)).
- AppendLine(")"c).
- DecrementIndent()
-
- CreateAnnotations(
- trigger,
- AddressOf _annotationCodeGenerator.Generate,
- parameters.Cloner.
- WithTargetName(triggerVariable).
- Clone)
-
- mainBuilder.AppendLine()
- End Sub
-
- Private Sub CreateAnnotations(entityType As IEntityType,
- mainBuilder As IndentedStringBuilder,
- methodBuilder As IndentedStringBuilder,
- namespaces As SortedSet(Of String),
- className As String)
-
- mainBuilder.
- AppendLine().
- Append("Public Shared Sub CreateAnnotations").
- AppendLine("(entityType As RuntimeEntityType)")
-
- Using mainBuilder.Indent()
-
- Const entityTypeVariable = "entityType"
- Dim variables = New HashSet(Of String) From {
- entityTypeVariable
- }
-
- CreateAnnotations(
- entityType,
- AddressOf _annotationCodeGenerator.Generate,
- New VisualBasicRuntimeAnnotationCodeGeneratorParameters(
- entityTypeVariable,
- className,
- mainBuilder,
- methodBuilder,
- namespaces,
- variables))
-
- mainBuilder.
- AppendLine().
- AppendLine("Customize(entityType)")
- End Using
-
- mainBuilder.
- AppendLine("End Sub").
- AppendLine().
- AppendLine("Shared Partial Private Sub Customize(entityType As RuntimeEntityType)").
- AppendLine("End Sub")
- End Sub
-
- Private Shared Sub CreateAnnotations(Of TAnnotatable As IAnnotatable)(
- annotatable As TAnnotatable,
- process As Action(Of TAnnotatable, VisualBasicRuntimeAnnotationCodeGeneratorParameters),
- parameters As VisualBasicRuntimeAnnotationCodeGeneratorParameters)
-
- process(
- annotatable,
- parameters.
- Cloner.
- WithAnnotations(annotatable.GetAnnotations().ToDictionary(Function(a) a.Name, Function(a) a.Value)).
- WithIsRuntime(False).
- Clone())
-
- process(
- annotatable,
- parameters.
- Cloner.
- WithAnnotations(annotatable.GetRuntimeAnnotations().ToDictionary(Function(a) a.Name, Function(a) a.Value)).
- WithIsRuntime(True).
- Clone())
- End Sub
-
- Private Shared Sub AddNamespace(type As Type, namespaces As ISet(Of String))
- VisualBasicRuntimeAnnotationCodeGenerator.AddNamespace(type, namespaces)
- End Sub
- End Class
-End Namespace
diff --git a/Sandbox/Module1.vb b/Sandbox/Module1.vb
index a4742f8..a453dea 100644
--- a/Sandbox/Module1.vb
+++ b/Sandbox/Module1.vb
@@ -24,11 +24,6 @@ Module Module1
'Scaffold-DbContext 'Data Source=northwind.db' Microsoft.EntityFrameworkCore.Sqlite -OutputDir Scaffolding\Northwind -ContextDir Scaffolding\Northwind\Context -DataAnnotations
'
- '-------------------------------------
- 'Compiled Models
- '-------------------------------------
- 'Optimize-DbContext -Project Sandbox -Context northwindContext -OutputDir MyCompiledModels -Namespace MyCompiledModels
-
Using dbContext As New SchoolContext()
dbContext.Students.Add(
New Student With {
diff --git a/Test/EFCore.VisualBasic.Test/Design/Query/LinqToVisualBasicTranslatorTest.vb b/Test/EFCore.VisualBasic.Test/Design/Query/LinqToVisualBasicTranslatorTest.vb
deleted file mode 100644
index 2274e4d..0000000
--- a/Test/EFCore.VisualBasic.Test/Design/Query/LinqToVisualBasicTranslatorTest.vb
+++ /dev/null
@@ -1,1781 +0,0 @@
-Imports System.Linq.Expressions
-Imports System.Reflection
-Imports System.Runtime.CompilerServices
-Imports EntityFrameworkCore.VisualBasic.Design.Internal
-Imports EntityFrameworkCore.VisualBasic.Design.Query.Internal
-Imports Microsoft.CodeAnalysis
-Imports Microsoft.EntityFrameworkCore.Query
-Imports Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.TestUtilities
-Imports Xunit
-Imports Xunit.Abstractions
-Imports Xunit.Sdk
-Imports Assert = Xunit.Assert
-Imports E = System.Linq.Expressions.Expression
-
-Namespace Design.Query
- Public Class LinqToVisualBasicTranslatorTest
-
- Private ReadOnly _testOutputHelper As ITestOutputHelper
-
- Public Sub New(TestOutputHelper As ITestOutputHelper)
- _testOutputHelper = TestOutputHelper
- _outputExpressionTrees = True
- End Sub
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public Sub Constant_values(constantValue As Object, literalRepresentation As String)
- AssertExpression(
- E.Constant(constantValue),
- literalRepresentation)
- End Sub
-
-
- Public Sub Constant_decimal()
- AssertExpression(E.Constant(1.5D), "1.5D")
- End Sub
-
-
- Public Sub Constant_nothing()
- AssertExpression(E.Constant(Nothing, GetType(String)), "Nothing")
- End Sub
-
-
- Public Sub Constant_throws_on_unsupported_type()
- Assert.Throws(Of NotSupportedException)(Sub() AssertExpression(E.Constant(CType(Nothing, DateTime)), ""))
- End Sub
-
-
- Public Sub [Enum]()
- AssertExpression(E.Constant(SomeEnum.One), "SomeEnum.One")
- End Sub
-
-
- Public Sub Enum_with_multiple_values()
- AssertExpression(E.Constant(SomeEnum.One Or SomeEnum.Two), "SomeEnum.One Or SomeEnum.Two")
- End Sub
-
-
- Public Sub Enum_with_unknown_value()
- AssertExpression(E.Constant(CType(1000, SomeEnum)), "CType(1000L, LinqToVisualBasicTranslatorTest.SomeEnum)")
- End Sub
-
-
-
-
-
-
-
-
-
-
- ")>
- =")>
-
-
-
-
-
-
- >")>
- Public Sub Binary_numeric(expressionType As ExpressionType, op As String)
- AssertExpression(
- E.MakeBinary(expressionType, E.Constant(2), E.Constant(3)),
- $"2 {op} 3")
- End Sub
-
-
- Public Sub Binary_Equal_value_type()
- AssertExpression(
- E.Equal(E.Constant(2), E.Constant(3)),
- "2 = 3")
- End Sub
-
-
- Public Sub Binary_Equal_reference_type()
- AssertExpression(
- E.Equal(E.Parameter(GetType(String), "s1"), E.Parameter(GetType(String), "s2")),
- "s1 = s2")
- End Sub
-
-
- Public Sub Binary_Equal_nullable_type_and_nothing()
- AssertExpression(
- E.Equal(E.Parameter(GetType(Integer?), "i"), E.Constant(Nothing, GetType(Integer?))),
- "i Is Nothing")
- End Sub
-
-
- Public Sub Binary_ReferenceEqual()
- AssertExpression(
- E.ReferenceEqual(E.Parameter(GetType(Blog), "b1"), E.Parameter(GetType(Blog), "b2")),
- "b1 Is b2")
- End Sub
-
-
- Public Sub Binary_Equal_with_reference_equality_semantics()
- AssertExpression(
- E.Equal(E.Convert(E.Parameter(GetType(Blog), "b1"), GetType(Object)),
- E.Convert(E.Parameter(GetType(Blog), "b2"), GetType(Object))),
- "CType(b1, Object) Is CType(b2, Object)")
- End Sub
-
-
- Public Sub Binary_NotEqual_value_type()
- AssertExpression(
- E.NotEqual(E.Constant(2), E.Constant(3)),
- "2 <> 3")
- End Sub
-
-
- Public Sub Binary_NotEqual_reference_type()
- AssertExpression(
- E.NotEqual(E.Parameter(GetType(String), "s1"), E.Parameter(GetType(String), "s2")),
- "s1 <> s2")
- End Sub
-
-
- Public Sub Binary_NotEqual_nullable_type_and_nothing()
- AssertExpression(
- E.NotEqual(E.Parameter(GetType(Integer?), "i"), E.Constant(Nothing, GetType(Integer?))),
- "i IsNot Nothing")
- End Sub
-
-
- Public Sub Binary_ReferenceNotEqual()
- AssertExpression(
- E.ReferenceNotEqual(E.Parameter(GetType(Blog), "b1"), E.Parameter(GetType(Blog), "b2")),
- "b1 IsNot b2")
- End Sub
-
-
- Public Sub Binary_ArrayIndex()
- AssertExpression(
- E.ArrayIndex(E.Parameter(GetType(Integer()), "i"), E.Constant(2)),
- "i(2)")
- End Sub
-
-
- Public Sub Binary_Power()
- AssertExpression(
- E.Power(E.Constant(2.0), E.Constant(3.0)),
- "2R ^ 3R")
- End Sub
-
-
- Public Sub Binary_Coalesce()
- AssertExpression(
- E.Coalesce(E.Parameter(GetType(Double?), "d"), E.Constant(3.0)),
- "If(d, 3R)")
- End Sub
-
-
-
-
-
-
-
- Public Sub Binary_boolean(expressionType As ExpressionType, op As String)
- AssertExpression(
- E.MakeBinary(expressionType, E.Constant(True), E.Constant(False)),
- $"True {op} False")
- End Sub
-
-
-
-
-
-
-
-
-
-
-
- >=")>
- Public Sub Binary_Assign_numeric(expressionType As ExpressionType, op As String)
- AssertStatement(
- E.MakeBinary(expressionType, E.Variable(GetType(Integer), "x"), E.Constant(3)),
- $"x {op} 3")
- End Sub
-
-
- Public Sub Binary_PowerAssign()
- AssertStatement(
- E.PowerAssign(E.Variable(GetType(Double), "x"), E.Constant(3.0)),
- $"x ^= 3R")
- End Sub
-
-
-
-
-
- Public Sub Binary_transformed_Assign_numeric(expressionType As ExpressionType, result As String)
- AssertStatement(
- E.MakeBinary(expressionType, E.Variable(GetType(Integer), "l"), E.Constant(3)),
- result)
- End Sub
-
-
-
- Public Sub Binary_VB_string_comparaison(expression As E, expected As String)
- AssertExpression(
- expression,
- expected)
- End Sub
-
- Private Shared Iterator Function VB_string_comparaison_operators() As IEnumerable(Of Object())
- Yield {DirectCast(Function(s$) "hello" = s, Expression(Of Func(Of String, Boolean))).Body, """hello"" = s"}
- Yield {DirectCast(Function(s$) s <> "hello", Expression(Of Func(Of String, Boolean))).Body, "s <> ""hello"""}
- Yield {DirectCast(Function(s$) s <= "hello", Expression(Of Func(Of String, Boolean))).Body, "s <= ""hello"""}
- Yield {DirectCast(Function(s$) s > "hello", Expression(Of Func(Of String, Boolean))).Body, "s > ""hello"""}
- End Function
-
-
-
-
-
-
-
-
-
- Public Sub Unary_expression_int(expressionType As ExpressionType, expected As String)
- AssertExpression(
- E.MakeUnary(expressionType, E.Parameter(GetType(Integer), "i"), GetType(Integer)),
- expected)
- End Sub
-
-
-
-
-
- Public Sub Unary_expression_bool(expressionType As ExpressionType, expected As String)
- AssertExpression(
- E.MakeUnary(expressionType, E.Parameter(GetType(Boolean), "b"), GetType(Boolean)),
- expected)
- End Sub
-
-
-
-
-
-
- Public Sub Not_supported_Unary_statement(expressionType As ExpressionType)
- Dim i = E.Parameter(GetType(Integer), "i")
-
- Assert.Throws(Of NotSupportedException)(
- Sub() AssertStatement(
- E.Block(
- variables:={i},
- E.MakeUnary(expressionType, i, GetType(Integer))), "")
- )
- End Sub
-
-
- Public Sub Unary_ArrayLength()
- AssertExpression(
- E.ArrayLength(E.Parameter(GetType(Integer()), "i")),
- "i.Length")
- End Sub
-
-
- Public Sub Unary_Convert()
- AssertExpression(
- E.Convert(
- E.Parameter(GetType(Object), "i"),
- GetType(String)),
- "CType(i, String)")
- End Sub
-
-
-
- Public Sub Unary_Convert_with_VB_type_conversion_functions(expression As E, expected As String)
- AssertExpression(
- expression,
- expected)
- End Sub
-
- Private Shared Iterator Function VB_type_conversion_functions() As IEnumerable(Of Object())
- Yield {DirectCast(Function(o As Object) CBool(o), Expression(Of Func(Of Object, Boolean))).Body, "CBool(o)"}
- Yield {DirectCast(Function(o As Object) CByte(o), Expression(Of Func(Of Object, Byte))).Body, "CByte(o)"}
- Yield {DirectCast(Function(o As Object) CChar(o), Expression(Of Func(Of Object, Char))).Body, "CChar(o)"}
- Yield {DirectCast(Function(o As Object) CDate(o), Expression(Of Func(Of Object, Date))).Body, "CDate(o)"}
- Yield {DirectCast(Function(o As Object) CDbl(o), Expression(Of Func(Of Object, Double))).Body, "CDbl(o)"}
- Yield {DirectCast(Function(o As Object) CDec(o), Expression(Of Func(Of Object, Decimal))).Body, "CDec(o)"}
- Yield {DirectCast(Function(o As Object) CInt(o), Expression(Of Func(Of Object, Integer))).Body, "CInt(o)"}
- Yield {DirectCast(Function(o As Object) CLng(o), Expression(Of Func(Of Object, Long))).Body, "CLng(o)"}
- Yield {DirectCast(Function(o As Object) CSByte(o), Expression(Of Func(Of Object, SByte))).Body, "CSByte(o)"}
- Yield {DirectCast(Function(o As Object) CShort(o), Expression(Of Func(Of Object, Short))).Body, "CShort(o)"}
- Yield {DirectCast(Function(o As Object) CSng(o), Expression(Of Func(Of Object, Single))).Body, "CSng(o)"}
- Yield {DirectCast(Function(o As Object) CStr(o), Expression(Of Func(Of Object, String))).Body, "CStr(o)"}
- Yield {DirectCast(Function(o As Object) CUInt(o), Expression(Of Func(Of Object, UInteger))).Body, "CUInt(o)"}
- Yield {DirectCast(Function(o As Object) CULng(o), Expression(Of Func(Of Object, ULong))).Body, "CULng(o)"}
- Yield {DirectCast(Function(o As Object) CUShort(o), Expression(Of Func(Of Object, UShort))).Body, "CUShort(o)"}
- End Function
-
-
- Public Sub Unary_Convert_char_to_integer()
- AssertExpression(
- E.Convert(
- E.Parameter(GetType(Char), "c"),
- GetType(Integer)),
- "Strings.AscW(c)")
- End Sub
-
-
- Public Sub Unary_Convert_integer_to_char()
- AssertExpression(
- E.Convert(
- E.Parameter(GetType(Integer), "i"),
- GetType(Char)),
- "Strings.ChrW(i)")
- End Sub
-
-
- Public Sub Unary_Throw()
- AssertStatement(
- E.Throw(E.[New](GetType(Exception))),
- "Throw New Exception()")
- End Sub
-
-
- Public Sub Unary_Unbox()
- AssertExpression(
- E.Unbox(E.Parameter(GetType(Object), "i"), GetType(Integer)),
- "i")
- End Sub
-
-
- Public Sub Unary_Quote()
- Dim expr As Expression(Of Func(Of String, Integer)) = Function(s) s.Length
- AssertExpression(
- E.Quote(expr),
- "Function(s As String) s.Length")
- End Sub
-
-
- Public Sub Unary_TypeAs_with_reference_type()
- AssertExpression(
- E.TypeAs(E.Parameter(GetType(Object), "i"), GetType(String)),
- "TryCast(i, String)")
- End Sub
-
-
- Public Sub Unary_TypeAs_with_nullable_type()
- AssertExpression(
- E.TypeAs(E.Parameter(GetType(Object), "i"), GetType(Integer?)),
- "If(TypeOf i Is Integer, CType(i, Integer), New Nullable(Of Integer))")
- End Sub
-
-
- Public Sub Instance_property()
- AssertExpression(
- E.Property(
- E.Constant("hello"),
- GetType(String).GetProperty(NameOf(String.Length))),
- """hello"".Length")
- End Sub
-
-
- Public Sub Static_property()
- AssertExpression(
- E.Property(
- Nothing,
- GetType(DateTime).GetProperty(NameOf(DateTime.Now))),
- "DateTime.Now")
- End Sub
-
-
- Public Sub Private_instance_field_read()
- AssertExpression(
- E.Field(E.Parameter(GetType(Blog), "blog"), "_privateField"),
- "GetType(LinqToVisualBasicTranslatorTest.Blog).GetField(""_privateField"", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(blog)")
- End Sub
-
-
- Public Sub Private_instance_field_write()
- AssertStatement(
- E.Assign(
- E.Field(E.Parameter(GetType(Blog), "blog"), "_privateField"),
- E.Constant(8)),
- "GetType(LinqToVisualBasicTranslatorTest.Blog).GetField(""_privateField"", BindingFlags.Instance Or BindingFlags.NonPublic).SetValue(blog, 8)")
- End Sub
-
-
- Public Sub Internal_instance_field_read()
- AssertExpression(
- E.Field(E.Parameter(GetType(Blog), "blog"), "InternalField"),
- "blog.InternalField")
- End Sub
-
-
- Public Sub [Not]()
- AssertExpression(
- E.Not(E.Constant(True)),
- "Not(True)")
- End Sub
-
-
- Public Sub MemberInit_with_MemberAssignment()
- AssertExpression(
- E.MemberInit(
- E.[New](
- GetType(Blog).GetConstructor({GetType(String)}),
- E.Constant("foo")),
- E.Bind(GetType(Blog).GetProperty(NameOf(Blog.PublicProperty)), E.Constant(8)),
- E.Bind(GetType(Blog).GetField(NameOf(Blog.PublicField)), E.Constant(9))),
- "New LinqToVisualBasicTranslatorTest.Blog(""foo"") With {.PublicProperty = 8, .PublicField = 9}")
- End Sub
-
-
- Public Sub MemberInit_with_MemberListBinding()
- AssertExpression(
- E.MemberInit(
- E.[New](
- GetType(Blog).GetConstructor({GetType(String)}),
- E.Constant("foo")),
- E.ListBind(GetType(Blog).GetProperty(NameOf(Blog.ListOfInts)),
- E.ElementInit(GetType(List(Of Integer)).GetMethod(NameOf(List(Of Integer).Add)), E.Constant(8)),
- E.ElementInit(GetType(List(Of Integer)).GetMethod(NameOf(List(Of Integer).Add)), E.Constant(9)))),
- "New LinqToVisualBasicTranslatorTest.Blog(""foo"") With {.ListOfInts = New List(Of Integer) From {8, 9}}")
- End Sub
-
-
- Public Sub MemberInit_with_MemberMemberBinding()
- AssertExpression(
- E.MemberInit(
- E.[New](
- GetType(Blog).GetConstructor({GetType(String)}),
- E.Constant("foo")),
- E.MemberBind(GetType(Blog).GetProperty(NameOf(Blog.Details)),
- E.Bind(GetType(BlogDetails).GetProperty(NameOf(BlogDetails.Foo)), E.Constant(5)),
- E.ListBind(GetType(BlogDetails).GetProperty(NameOf(BlogDetails.ListOfInts)),
- E.ElementInit(GetType(List(Of Integer)).GetMethod(NameOf(List(Of Integer).Add)), E.Constant(8)),
- E.ElementInit(GetType(List(Of Integer)).GetMethod(NameOf(List(Of Integer).Add)), E.Constant(9))))),
- "New LinqToVisualBasicTranslatorTest.Blog(""foo"") With {.Details = New LinqToVisualBasicTranslatorTest.BlogDetails With {.Foo = 5, .ListOfInts = New List(Of Integer) From {8, 9}}}")
- End Sub
-
-
- Public Sub Method_call_instance()
-
- Dim blogExpr = E.Parameter(GetType(Blog), "blog")
-
- AssertStatement(
- E.Block(
- variables:={blogExpr},
- E.Assign(blogExpr, E.[New](Blog.Constructor)),
- E.Call(
- blogExpr,
- GetType(Blog).GetMethod(NameOf(Blog.SomeInstanceMethod)))),
-"Dim blog As LinqToVisualBasicTranslatorTest.Blog = New LinqToVisualBasicTranslatorTest.Blog()
-blog.SomeInstanceMethod()")
- End Sub
-
-
- Public Sub Method_call_static()
- AssertExpression(
- E.Call(ReturnsIntWithParamMethod, E.Constant(8)),
- "LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(8)")
- End Sub
-
-
- Public Sub Method_call_static_on_nested_type()
- AssertExpression(
- E.Call(GetType(Blog).GetMethod(NameOf(Blog.Static_method_on_nested_type))),
- "LinqToVisualBasicTranslatorTest.Blog.Static_method_on_nested_type()")
- End Sub
-
-
- Public Sub Method_call_extension()
- Dim blog = E.Parameter(GetType(LinqExpressionToRoslynTranslatorExtensionType), "someType")
-
- AssertStatement(
- E.Block(
- variables:={blog},
- E.Assign(blog, E.[New](LinqExpressionToRoslynTranslatorExtensionType.Constructor)),
- E.Call(LinqExpressionToRoslynTranslatorExtensions.SomeExtensionMethod, blog)),
-"Dim someType As LinqExpressionToRoslynTranslatorExtensionType = New LinqExpressionToRoslynTranslatorExtensionType()
-someType.SomeExtension()")
- End Sub
-
-
- Public Sub Method_call_extension_with_null_this()
- AssertExpression(
- E.Call(
- LinqExpressionToRoslynTranslatorExtensions.SomeExtensionMethod,
- E.Constant(Nothing, GetType(LinqExpressionToRoslynTranslatorExtensionType))),
- "LinqExpressionToRoslynTranslatorExtensions.SomeExtension(Nothing)")
- End Sub
-
-
- Public Sub Method_call_generic()
- Dim blogExpr = E.Parameter(GetType(Blog), "blog")
-
- AssertStatement(
- E.Block(
- variables:={blogExpr},
- E.Assign(blogExpr, E.[New](Blog.Constructor)),
- E.Call(
- GenericMethod.MakeGenericMethod(GetType(Blog)),
- blogExpr)),
-"Dim blog As LinqToVisualBasicTranslatorTest.Blog = New LinqToVisualBasicTranslatorTest.Blog()
-LinqToVisualBasicTranslatorTest.GenericMethodImplementation(blog)")
- End Sub
-
-
- Public Sub Method_call_namespace_is_collected()
- Dim translator = CreateTranslator().Item1
- Dim namespaces As New HashSet(Of String)()
- translator.TranslateExpression(E.Call(FooMethod), namespaces)
- Assert.Collection(namespaces,
- Sub(ns) Assert.Equal(GetType(LinqToVisualBasicTranslatorTest).Namespace, ns))
- End Sub
-
-
- Public Sub Instantiation()
- AssertExpression(
- E.[New](
- GetType(Blog).GetConstructor({GetType(String)}),
- E.Constant("foo")),
- "New LinqToVisualBasicTranslatorTest.Blog(""foo"")")
- End Sub
-
-
- Public Sub Lambda_with_expression_body()
- AssertExpression(
- E.Lambda(Of Func(Of Boolean))(E.Constant(True)),
- "Function() True")
- End Sub
-
-
- Public Sub Lambda_with_block_body()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertExpression(
- E.Lambda(Of Func(Of Integer))(
- E.Block(
- variables:={i},
- E.Assign(i, E.Constant(8)),
- i)),
-"Function() As Integer
- Dim i As Integer = 8
- Return i
-End Function")
- End Sub
-
-
- Public Sub Lambda_procedure_single_line()
-
- AssertExpression(
- E.Lambda(Of Action)(
- E.Call(FooMethod)),
- "Sub() LinqToVisualBasicTranslatorTest.Foo()")
- End Sub
-
-
- Public Sub Lambda_procedure_with_block_body()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertExpression(
- E.Lambda(Of Action)(
- E.Block(
- variables:={i},
- E.Assign(i, E.Constant(8)),
- i)),
-"Sub()
- Dim i As Integer = 8
-End Sub")
- End Sub
-
-
- Public Sub Lambda_with_no_parameters()
- AssertExpression(
- E.Lambda(Of Func(Of Boolean))(E.Constant(True)),
- "Function() True")
- End Sub
-
-
- Public Sub Lambda_with_one_parameter()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertExpression(
- E.Lambda(Of Func(Of Integer, Boolean))(E.Constant(True), i),
- "Function(i As Integer) True")
- End Sub
-
-
- Public Sub Lambda_with_two_parameters()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
-
- AssertExpression(
- E.Lambda(Of Func(Of Integer, Integer, Integer))(E.Add(i, j), i, j),
- "Function(i As Integer, j As Integer) i + j")
- End Sub
-
-
- Public Sub Lambda_parameter_names_are_made_unique()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim i0 = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Lambda(Of Func(Of Integer, Integer, Integer))(E.Add(E.Add(i, j), i0), i0, j)),
-"Dim i As Integer
-Dim unnamed = Function(i0 As Integer, j As Integer) i + j + i0")
- End Sub
-
-
- Public Sub Invocation_with_literal_argument()
- Dim expr As Expression(Of Func(Of Integer, Boolean)) = Function(f) f > 5
-
- AssertExpression(
- E.AndAlso(
- E.Constant(True),
- E.Invoke(expr, E.Constant(8))),
- "True AndAlso 8 > 5")
- End Sub
-
-
- Public Sub Invocation_with_argument_that_has_side_effects()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim expr As Expression(Of Func(Of Integer, Integer)) = Function(f) f + f
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(
- i,
- E.Add(
- E.Constant(5),
- E.Invoke(expr, E.Call(FooMethod))))),
-"Dim f = LinqToVisualBasicTranslatorTest.Foo()
-Dim i As Integer = 5 + f + f")
- End Sub
-
-
- Public Sub Conditional_expression()
- AssertExpression(
- E.Condition(E.Constant(True), E.Constant(1), E.Constant(2)),
- "If(True, 1, 2)")
- End Sub
-
-
- Public Sub Conditional_without_false_value_fails()
- Assert.Throws(Of NotSupportedException)(
- Sub() AssertExpression(
- E.IfThen(E.Constant(True), E.Constant(8)),
- "If(True, 8, )"))
- End Sub
-
-
- Public Sub Conditional_statement()
- AssertStatement(
- E.Block(
- E.Condition(E.Constant(True), E.Call(FooMethod), E.Call(BarMethod)),
- E.Constant(8)),
-"If True Then
- LinqToVisualBasicTranslatorTest.Foo()
-Else
- LinqToVisualBasicTranslatorTest.Bar()
-End If")
- End Sub
-
-
- Public Sub IfThen_statement()
-
- Dim parameter = E.Parameter(GetType(Integer), "i")
- Dim block = E.Block(
- variables:={parameter},
- expressions:={E.Assign(parameter, E.Constant(8))})
-
- AssertStatement(
- E.Block(E.IfThen(E.Constant(True), block)),
-"If True Then
- Dim i As Integer = 8
-End If")
- End Sub
-
-
- Public Sub IfThenElse_statement()
- Dim parameter1 = E.Parameter(GetType(Integer), "i")
- Dim block1 = E.Block(
- variables:={parameter1},
- expressions:={E.Assign(parameter1, E.Constant(8))})
-
- Dim parameter2 = E.Parameter(GetType(Integer), "j")
- Dim block2 = E.Block(
- variables:={parameter2},
- expressions:={E.Assign(parameter2, E.Constant(9))})
-
- AssertStatement(
- E.Block(E.IfThenElse(E.Constant(True), block1, block2)),
-"If True Then
- Dim i As Integer = 8
-Else
- Dim j As Integer = 9
-End If")
- End Sub
-
-
- Public Sub IfThenElse_nested()
-
- Dim Variable = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={Variable},
- expressions:={E.IfThenElse(
- E.Constant(True),
- E.Block(E.Assign(Variable, E.Constant(1))),
- E.IfThenElse(
- E.Constant(False),
- E.Block(E.Assign(Variable, E.Constant(2))),
- E.IfThenElse(
- E.Constant(False),
- E.Block(E.Assign(Variable, E.Constant(3))),
- E.Block({E.Assign(Variable, E.Constant(4)),
- E.Add(E.Constant(5), E.Constant(6))}))))}),
-"Dim i As Integer
-If True Then
- i = 1
-ElseIf False
- i = 2
-ElseIf False
- i = 3
-Else
- i = 4
- Dim unnamed = 5 + 6
-End If")
- End Sub
-
-
- Public Sub Conditional_expression_with_block_in_lambda()
- AssertExpression(
- E.Lambda(Of Func(Of Integer))(
- E.Condition(
- E.Constant(True),
- E.Block(
- E.Call(FooMethod),
- E.Constant(8)),
- E.Constant(9))),
-"Function() As Integer
- If True Then
- LinqToVisualBasicTranslatorTest.Foo()
- Return 8
- Else
- Return 9
- End If
-End Function")
- End Sub
-
-
- Public Sub IfThen_with_block_inside_expression_block_with_lifted_statements()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(
- i, E.Block( ' We're in expression context. Do anything that will get lifted.
- E.Call(FooMethod), ' Statement condition
- E.IfThen(
- E.Constant(True),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod))), ' Last expression (to make the block above evaluate as statement
- E.Constant(8)))),
-"LinqToVisualBasicTranslatorTest.Foo()
-If True Then
- LinqToVisualBasicTranslatorTest.Bar()
- LinqToVisualBasicTranslatorTest.Baz()
-End If
-Dim i As Integer = 8")
- End Sub
-
-
- Public Sub Switch_expression()
- AssertExpression(
- E.Switch(
- E.Constant(8),
- E.Constant(0),
- E.SwitchCase(E.Constant(-9), E.Constant(9)),
- E.SwitchCase(E.Constant(-10), E.Constant(10))),
- "If(8 = 9, -9, If(8 = 10, -10, 0))")
- End Sub
-
-
- Public Sub Switch_expression_nested()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
- Dim k = E.Parameter(GetType(Integer), "k")
-
- AssertStatement(
- E.Block(
- variables:={i, j, k},
- E.Assign(j, E.Constant(8)),
- E.Assign(
- i,
- E.Switch(
- j,
- defaultBody:=E.Constant(0),
- E.SwitchCase(E.Constant(1), E.Constant(100)),
- E.SwitchCase(
- E.Switch(
- k,
- defaultBody:=E.Constant(0),
- E.SwitchCase(E.Constant(2), E.Constant(200)),
- E.SwitchCase(E.Constant(3), E.Constant(300))),
- E.Constant(200))))),
-"Dim k As Integer
-Dim j As Integer = 8
-Dim i As Integer = If(j = 100, 1, If(j = 200, If(k = 200, 2, If(k = 300, 3, 0)), 0))")
- End Sub
-
-
- Public Sub Switch_expression_with_reference_equality()
- AssertExpression(
- E.Switch(
- E.Parameter(GetType(Blog), "blog1"),
- E.Constant(0),
- E.SwitchCase(E.Constant(2), E.Parameter(GetType(Blog), "blog2")),
- E.SwitchCase(E.Constant(3), E.Parameter(GetType(Blog), "blog3"))),
- "If(blog1 Is blog2, 2, If(blog1 Is blog3, 3, 0))")
- End Sub
-
-
- Public Sub Switch_statement_with_reference_equality()
- AssertStatement(
- E.Switch(
- E.Convert(E.Parameter(GetType(Blog), "blog1"), GetType(Object)),
- E.Constant(0),
- E.SwitchCase(E.Constant(1), E.Convert(E.Parameter(GetType(Blog), "blog2"), GetType(Object))),
- E.SwitchCase(E.Constant(2), E.Convert(E.Parameter(GetType(Blog), "blog3"), GetType(Object)))),
-"If CType(blog1, Object) Is CType(blog2, Object) Then
- Dim unnamed = 1
-ElseIf CType(blog1, Object) Is CType(blog3, Object)
- Dim unnamed = 2
-Else
- Dim unnamed = 0
-End If")
- End Sub
-
-
- Public Sub Switch_statement_without_default()
- Dim parameter = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={parameter},
- expressions:={E.Switch(
- E.Constant(7),
- E.SwitchCase(E.Block(GetType(Void), E.Assign(parameter, E.Constant(9))), E.Constant(-9)),
- E.SwitchCase(E.Block(GetType(Void), E.Assign(parameter, E.Constant(10))), E.Constant(-10)))}),
-"Dim i As Integer
-Select 7
- Case -9
- i = 9
- Case -10
- i = 10
-End Select")
- End Sub
-
-
- Public Sub Switch_statement_with_default()
- Dim parameter = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={parameter},
- expressions:={E.Switch(
- E.Constant(7),
- E.Assign(parameter, E.Constant(0)),
- E.SwitchCase(E.Assign(parameter, E.Constant(9)), E.Constant(-9)),
- E.SwitchCase(E.Assign(parameter, E.Constant(10)), E.Constant(-10)))}),
-"Dim i As Integer
-Select 7
- Case -9
- i = 9
- Case -10
- i = 10
- Case Else
- i = 0
-End Select")
- End Sub
-
-
- Public Sub Switch_statement_with_multiple_labels()
-
- Dim parameter = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={parameter},
- expressions:={E.Switch(
- E.Constant(7),
- E.Assign(parameter, E.Constant(0)),
- E.SwitchCase(E.Assign(parameter, E.Constant(9)), E.Constant(-9), E.Constant(-8)),
- E.SwitchCase(E.Assign(parameter, E.Constant(10)), E.Constant(-10)))}),
-"Dim i As Integer
-Select 7
- Case -9, -8
- i = 9
- Case -10
- i = 10
- Case Else
- i = 0
-End Select")
- End Sub
-
-
- Public Sub Variable_assignment_uses_Dim()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i, E.Constant(8))),
-"Dim i As Integer = 8")
- End Sub
-
-
- Public Sub Variable_assignment_to_nothing()
- Dim s = E.Parameter(GetType(String), "s")
-
- AssertStatement(
- E.Block(
- variables:={s},
- E.Assign(s, E.Constant(Nothing, GetType(String)))),
- "Dim s As String = Nothing")
- End Sub
-
-
- Public Sub Variables_with_same_name_in_sibling_blocks_do_get_renamed()
- Dim i1 = E.Parameter(GetType(Integer), "i")
- Dim i2 = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- E.Block(
- variables:={i1},
- E.Assign(i1, E.Constant(8)),
- E.Call(ReturnsIntWithParamMethod, i1)),
- E.Block(
- variables:={i2},
- E.Assign(i2, E.Constant(8)),
- E.Call(ReturnsIntWithParamMethod, i2))),
-"Dim i As Integer = 8
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(i)
-Dim i As Integer = 8
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(i)")
- End Sub
-
-
- Public Sub Variable_with_same_name_in_child_block_gets_renamed()
-
- Dim i1 = E.Parameter(GetType(Integer), "i")
- Dim i2 = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i1},
- E.Assign(i1, E.Constant(8)),
- E.Call(ReturnsIntWithParamMethod, i1),
- E.Block(
- variables:={i2},
- E.Assign(i2, E.Constant(8)),
- E.Call(ReturnsIntWithParamMethod, i2),
- E.Call(ReturnsIntWithParamMethod, i1))),
-"Dim i As Integer = 8
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(i)
-Dim i0 As Integer = 8
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(i0)
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(i)")
- End Sub
-
-
- Public Sub Variable_with_same_name_in_lambda_get_renamed()
-
- Dim i1 = E.Parameter(GetType(Integer), "i")
- Dim i2 = E.Parameter(GetType(Integer), "i")
- Dim f = E.Parameter(GetType(Func(Of Integer, Boolean)), "f")
-
- AssertStatement(
- E.Block(
- variables:={i1},
- E.Assign(i1, E.Constant(8)),
- E.Assign(
- f, E.Lambda(Of Func(Of Integer, Boolean))(
- E.Equal(i2, E.Constant(5)),
- i2))),
-"Dim i As Integer = 8
-f = Function(i0 As Integer) i0 = 5")
- End Sub
-
-
- Public Sub Same_parameter_instance_is_used_twice_in_nested_lambdas()
- Dim f1 = E.Parameter(GetType(Func(Of Integer, Boolean)), "f1")
- Dim f2 = E.Parameter(GetType(Func(Of Integer, Boolean)), "f2")
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Assign(
- f1,
- E.Lambda(Of Func(Of Integer, Boolean))(
- E.Block(
- E.Assign(
- f2,
- E.Lambda(Of Func(Of Integer, Boolean))(
- E.Equal(i, E.Constant(5)),
- i)),
- E.Constant(True)),
- i)),
-"f1 = Function(i As Integer) As Boolean
- f2 = Function(i0 As Integer) i0 = 5
- Return True
-End Function")
- End Sub
-
-
- Public Sub Block_with_non_standalone_expression_as_statement()
- AssertStatement(
- E.Block(E.Add(E.Constant(1), E.Constant(2))),
- "Dim unnamed = 1 + 2")
- End Sub
-
-
- Public Sub Lift_block_in_assignment_context()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i, E.Block(
- variables:={j},
- E.Assign(j, E.Call(FooMethod)),
- E.Call(ReturnsIntWithParamMethod, j)))),
-"Dim j As Integer = LinqToVisualBasicTranslatorTest.Foo()
-Dim i As Integer = LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(j)")
- End Sub
-
-
- Public Sub Lift_block_in_method_call_context()
- AssertStatement(
- E.Block(
- E.Call(
- ReturnsIntWithParamMethod,
- E.Block(
- E.Call(FooMethod),
- E.Call(BarMethod)))),
-"LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(LinqToVisualBasicTranslatorTest.Bar())")
- End Sub
-
-
- Public Sub Lift_nested_block()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
-
- AssertStatement(
- E.Block(variables:={i},
- E.Assign(
- i,
- E.Block(
- variables:={j},
- E.Assign(j, E.Call(FooMethod)),
- E.Block(
- E.Call(BarMethod),
- E.Call(ReturnsIntWithParamMethod, j))))),
-"Dim j As Integer = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Bar()
-Dim i As Integer = LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(j)")
- End Sub
-
-
- Public Sub Binary_lifts_left_side_if_right_is_lifted()
-
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i,
- E.Add(
- E.Call(FooMethod),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod))))),
-"Dim lifted = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Bar()
-Dim i As Integer = lifted + LinqToVisualBasicTranslatorTest.Baz()")
- End Sub
-
-
- Public Sub Binary_does_not_lift_left_side_if_it_has_no_side_effects()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i,
- E.Add(
- E.Constant(5),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod))))),
-"LinqToVisualBasicTranslatorTest.Bar()
-Dim i As Integer = 5 + LinqToVisualBasicTranslatorTest.Baz()")
- End Sub
-
-
- Public Sub Method_lifts_earlier_args_if_later_arg_is_lifted()
- Dim i = E.Parameter(GetType(Integer), "i")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i,
- E.Call(
- GetType(LinqToVisualBasicTranslatorTest).GetMethod(NameOf(MethodWithSixParams)),
- E.Call(FooMethod),
- E.Constant(5),
- E.Block(E.Call(BarMethod), E.Call(BazMethod)),
- E.Call(FooMethod),
- E.Block(E.Call(BazMethod), E.Call(BarMethod)),
- E.Call(FooMethod)))),
-"Dim liftedArg = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Bar()
-Dim liftedArg0 = LinqToVisualBasicTranslatorTest.Baz()
-Dim liftedArg1 = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Baz()
-Dim i As Integer = LinqToVisualBasicTranslatorTest.MethodWithSixParams(liftedArg, 5, liftedArg0, liftedArg1, LinqToVisualBasicTranslatorTest.Bar(), LinqToVisualBasicTranslatorTest.Foo())")
- End Sub
-
-
- Public Sub New_lifts_earlier_args_if_later_arg_is_lifted()
- Dim b = E.Parameter(GetType(Blog), "b")
-
- AssertStatement(
- E.Block(
- variables:={b},
- E.Assign(b,
- E.[New](
- GetType(Blog).GetConstructor({GetType(Integer), GetType(Integer)}),
- E.Call(FooMethod),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod))))),
-"Dim liftedArg = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Bar()
-Dim b As LinqToVisualBasicTranslatorTest.Blog = New LinqToVisualBasicTranslatorTest.Blog(liftedArg, LinqToVisualBasicTranslatorTest.Baz())")
- End Sub
-
-
- Public Sub Index_lifts_earlier_args_if_later_arg_is_lifted()
- ' TODO: Implement
- End Sub
-
-
- Public Sub New_array()
- AssertExpression(
- E.NewArrayInit(GetType(Integer)),
- "New Integer() {}")
- End Sub
-
-
- Public Sub New_array_with_bounds()
- AssertExpression(
- E.NewArrayBounds(GetType(Integer), E.Constant(3)),
- "New Integer(3 - 1) {}")
- End Sub
-
-
- Public Sub New_array_with_initializers()
- AssertExpression(
- E.NewArrayInit(GetType(Integer), E.Constant(3), E.Constant(4)),
- "New Integer() {3, 4}")
- End Sub
-
-
- Public Sub New_array_lifts_earlier_args_if_later_arg_is_lifted()
- Dim a = E.Parameter(GetType(Integer()), "a")
-
- AssertStatement(
- E.Block(
- variables:={a},
- E.Assign(a,
- E.NewArrayInit(
- GetType(Integer),
- E.Call(FooMethod),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod))))),
-"Dim liftedArg = LinqToVisualBasicTranslatorTest.Foo()
-LinqToVisualBasicTranslatorTest.Bar()
-Dim a As Integer() = New Integer() {liftedArg, LinqToVisualBasicTranslatorTest.Baz()}")
- End Sub
-
-
- Public Sub Lift_variable_in_expression_block()
-
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i, E.Block(
- variables:={j},
- E.Block(
- E.Call(FooMethod),
- E.Assign(j, E.Constant(8)),
- E.Constant(9))))),
-"Dim j As Integer
-LinqToVisualBasicTranslatorTest.Foo()
-j = 8
-Dim i As Integer = 9")
- End Sub
-
-
- Public Sub Lift_block_in_lambda_body_expression()
- AssertExpression(
- E.Lambda(Of Func(Of Integer))(
- E.Call(
- ReturnsIntWithParamMethod,
- E.Block(
- E.Call(FooMethod),
- E.Call(BarMethod))),
- Array.Empty(Of ParameterExpression)()),
-"Function() As Integer
- LinqToVisualBasicTranslatorTest.Foo()
- Return LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(LinqToVisualBasicTranslatorTest.Bar())
-End Function")
- End Sub
-
-
- Public Sub Do_not_lift_block_in_lambda_body()
- AssertExpression(
- E.Lambda(Of Func(Of Integer))(
- E.Block(E.Block(E.Constant(8))),
- Array.Empty(Of ParameterExpression)()),
- "Function() Return 8")
- End Sub
-
-
- Public Sub Simplify_block_with_single_expression()
- AssertStatement(
- E.Assign(E.Parameter(GetType(Integer), "i"), E.Block(E.Constant(8))),
- "i = 8")
- End Sub
-
-
- Public Sub Cannot_lift_out_of_expression_context()
- Assert.Throws(Of NotSupportedException)(
- Sub() AssertExpression(
- E.Assign(
- E.Parameter(GetType(Integer), "i"),
- E.Block(
- E.Call(FooMethod),
- E.Constant(8))),
- ""))
- End Sub
-
-
- Public Sub Lift_switch_expression()
-
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
- Dim k = E.Parameter(GetType(Integer), "k")
-
- AssertStatement(
- E.Block(
- variables:={i, j},
- E.Assign(j, E.Constant(8)),
- E.Assign(
- i,
- E.Switch(
- j,
- defaultBody:=E.Block(E.Constant(0)),
- E.SwitchCase(
- E.Block(
- E.Block(
- E.Assign(k, E.Call(FooMethod)),
- E.Call(ReturnsIntWithParamMethod, k))),
- E.Constant(8)),
- E.SwitchCase(E.Constant(2), E.Constant(9))))),
-"Dim i As Integer
-Dim j As Integer = 8
-Select j
- Case 8
- k = LinqToVisualBasicTranslatorTest.Foo()
- i = LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(k)
- Case 9
- i = 2
- Case Else
- i = 0
-End Select")
- End Sub
-
-
- Public Sub Lift_nested_switch_expression()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim j = E.Parameter(GetType(Integer), "j")
- Dim k = E.Parameter(GetType(Integer), "k")
- Dim l = E.Parameter(GetType(Integer), "l")
-
- AssertStatement(
- E.Block(
- variables:={i, j, k},
- E.Assign(j, E.Constant(8)),
- E.Assign(
- i,
- E.Switch(
- j,
- defaultBody:=E.Constant(0),
- E.SwitchCase(E.Constant(1), E.Constant(100)),
- E.SwitchCase(
- E.Switch(
- k,
- defaultBody:=E.Constant(0),
- E.SwitchCase(
- E.Block(
- variables:={l},
- E.Assign(l, E.Call(FooMethod)),
- E.Call(ReturnsIntWithParamMethod, l)),
- E.Constant(200)),
- E.SwitchCase(E.Constant(3), E.Constant(300))),
- E.Constant(200))))),
-"Dim i As Integer
-Dim k As Integer
-Dim j As Integer = 8
-Select j
- Case 100
- i = 1
- Case 200
- Select k
- Case 200
- Dim l As Integer = LinqToVisualBasicTranslatorTest.Foo()
- i = LinqToVisualBasicTranslatorTest.ReturnsIntWithParam(l)
- Case 300
- i = 3
- Case Else
- i = 0
- End Select
-
- Case Else
- i = 0
-End Select")
- End Sub
-
-
- Public Sub ListInit_node()
- AssertExpression(
- E.ListInit(
- E.[New](GetType(List(Of Integer))),
- GetType(List(Of Integer)).GetMethod(NameOf(List(Of Integer).Add)),
- E.Constant(8),
- E.Constant(9)),
- "New List(Of Integer)() From {8, 9}")
- End Sub
-
-
- Public Sub TypeEqual_node()
- AssertExpression(
- E.TypeEqual(E.Parameter(GetType(Object), "p"), GetType(Integer)),
- "p.GetType() = GetType(Integer)")
- End Sub
-
-
- Public Sub TypeIs_node()
- AssertExpression(
- E.TypeIs(E.Parameter(GetType(Object), "p"), GetType(Integer)),
- "TypeOf p Is Integer")
- End Sub
-
-
- Public Sub Goto_with_named_label()
- Dim labelTarget = E.Label("label1")
-
- AssertStatement(
- E.Block(
- E.Goto(labelTarget),
- E.Label(labelTarget),
- E.Call(FooMethod)),
-"GoTo label1
-label1:
-LinqToVisualBasicTranslatorTest.Foo()")
- End Sub
-
-
- Public Sub Goto_with_label_on_last_line()
- Dim labelTarget = E.Label("label1")
-
- AssertStatement(
- E.Block(
- E.Goto(labelTarget),
- E.Label(labelTarget)),
-"GoTo label1
-label1:")
- End Sub
-
-
- Public Sub Goto_outside_label()
-
- Dim labelTarget = E.Label()
-
- AssertStatement(
- E.Block(
- E.IfThen(
- E.Constant(True),
- E.Block(
- E.Call(FooMethod),
- E.Goto(labelTarget))),
- E.Label(labelTarget)),
-"If True Then
- LinqToVisualBasicTranslatorTest.Foo()
- GoTo unnamedLabel
-End If
-unnamedLabel:")
- End Sub
-
-
- Public Sub Goto_with_unnamed_labels_in_sibling_blocks()
- Dim labelTarget1 = E.Label()
- Dim labelTarget2 = E.Label()
-
- AssertStatement(
- E.Block(
- E.Block(
- E.Goto(labelTarget1),
- E.Label(labelTarget1)),
- E.Block(
- E.Goto(labelTarget2),
- E.Label(labelTarget2))),
-"GoTo unnamedLabel
-unnamedLabel:
-GoTo unnamedLabel0
-unnamedLabel0:")
- End Sub
-
-
- Public Sub Loop_statement_infinite()
- AssertStatement(
- E.Loop(E.Call(FooMethod)),
-"While True
- LinqToVisualBasicTranslatorTest.Foo()
-End While")
- End Sub
-
-
- Public Sub Loop_statement_with_break_and_continue()
- Dim i = E.Parameter(GetType(Integer), "i")
- Dim breakLabel = E.Label()
- Dim continueLabel = E.Label()
-
- AssertStatement(
- E.Block(
- variables:={i},
- E.Assign(i, E.Constant(0)),
- E.Loop(
- E.Block(
- E.IfThen(
- E.Equal(i, E.Constant(100)),
- E.Break(breakLabel)),
- E.IfThen(
- E.Equal(E.Modulo(i, E.Constant(2)), E.Constant(0)),
- E.Continue(continueLabel)),
- E.AddAssign(i, E.Constant(1, GetType(Integer)))),
- breakLabel,
- continueLabel)),
-"Dim i As Integer = 0
-While True
-unnamedLabel0:
- If i = 100 Then
- GoTo unnamedLabel
- End If
-
- If i Mod 2 = 0 Then
- GoTo unnamedLabel0
- End If
-
- i += 1
-End While
-unnamedLabel:")
- End Sub
-
-
- Public Sub Try_catch_statement()
- Dim expr = E.Parameter(GetType(InvalidOperationException), "e")
-
- AssertStatement(
- E.TryCatch(
- E.Call(FooMethod),
- E.Catch(expr, E.Call(BarMethod)),
- E.Catch(expr, E.Call(BazMethod))),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Catch e As InvalidOperationException
- LinqToVisualBasicTranslatorTest.Bar()
-Catch e As InvalidOperationException
- LinqToVisualBasicTranslatorTest.Baz()
-End Try")
- End Sub
-
-
- Public Sub Try_finally_statement()
- AssertStatement(
- E.TryFinally(
- E.Call(FooMethod),
- E.Call(BarMethod)),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Finally
- LinqToVisualBasicTranslatorTest.Bar()
-End Try")
- End Sub
-
-
- Public Sub Try_catch_finally_statement()
-
- Dim expr = E.Parameter(GetType(InvalidOperationException), "e")
-
- AssertStatement(
- E.TryCatchFinally(
- E.Call(FooMethod),
- E.Block(
- E.Call(BarMethod),
- E.Call(BazMethod)),
- E.Catch(expr, E.Call(BarMethod)),
- E.Catch(
- expr,
- E.Call(BazMethod),
- E.Equal(
- E.Property(expr, NameOf(Exception.Message)),
- E.Constant("foo")))),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Catch e As InvalidOperationException
- LinqToVisualBasicTranslatorTest.Bar()
-Catch e As InvalidOperationException When e.Message = ""foo""
- LinqToVisualBasicTranslatorTest.Baz()
-Finally
- LinqToVisualBasicTranslatorTest.Bar()
- LinqToVisualBasicTranslatorTest.Baz()
-End Try")
- End Sub
-
-
- Public Sub Try_catch_statement_with_filter()
- Dim expr = E.Parameter(GetType(InvalidOperationException), "e")
-
- AssertStatement(
- E.TryCatch(
- E.Call(FooMethod),
- E.Catch(
- expr,
- E.Call(BarMethod),
- E.Equal(
- E.Property(expr, NameOf(Exception.Message)),
- E.Constant("foo")))),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Catch e As InvalidOperationException When e.Message = ""foo""
- LinqToVisualBasicTranslatorTest.Bar()
-End Try")
- End Sub
-
-
- Public Sub Try_catch_statement_without_exception_reference()
- AssertStatement(
- E.TryCatch(
- E.Call(FooMethod),
- E.Catch(
- GetType(InvalidOperationException),
- E.Call(BarMethod))),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Catch unnamed As InvalidOperationException
- LinqToVisualBasicTranslatorTest.Bar()
-End Try")
- End Sub
-
-
- Public Sub Try_fault_statement()
- AssertStatement(
- E.TryFault(
- E.Call(FooMethod),
- E.Call(BarMethod)),
-"Try
- LinqToVisualBasicTranslatorTest.Foo()
-Catch
- LinqToVisualBasicTranslatorTest.Bar()
-End Try")
- End Sub
-
- 'TODO Try/Catch expressions
-
- Private Sub AssertStatement(expression As Expression, expected As String)
- AssertCore(expression, isStatement:=True, expected)
- End Sub
-
- Private Sub AssertExpression(expression As Expression, expected As String)
- AssertCore(expression, isStatement:=False, expected)
- End Sub
-
- Private Sub AssertCore(expression As Expression, isStatement As Boolean, expected As String)
- Dim typeMappingSource As New SqlServerTypeMappingSource(
- TestServiceFactory.Instance.Create(Of TypeMappingSourceDependencies)(),
- New RelationalTypeMappingSourceDependencies(Array.Empty(Of IRelationalTypeMappingSourcePlugin)()))
-
- Dim translator = New VisualBasicHelper(typeMappingSource)
- Dim namespaces = New HashSet(Of String)()
- Dim actual = If(isStatement,
- translator.Statement(expression, namespaces),
- translator.Expression(expression, namespaces))
-
- If _outputExpressionTrees Then
- _testOutputHelper.WriteLine("---- Input LINQ expression tree:")
- _testOutputHelper.WriteLine(_expressionPrinter.PrintExpression(expression))
- End If
-
- ' TODO Actually compile the output VB code To make sure it's valid.
-
- Try
- Assert.Equal(expected, actual.TrimEnd({vbCr(0), vbLf(0)}), ignoreLineEndingDifferences:=True)
-
- If _outputExpressionTrees Then
- _testOutputHelper.WriteLine("---- Output Roslyn syntax tree:")
- _testOutputHelper.WriteLine(actual)
- End If
- Catch ex As EqualException
- _testOutputHelper.WriteLine("---- Output Roslyn syntax tree:")
- _testOutputHelper.WriteLine(actual)
-
- Throw
- End Try
- End Sub
-
- Private Function CreateTranslator() As (LinqToVisualBasicSyntaxTranslator, AdhocWorkspace)
- Dim workspace As New AdhocWorkspace()
- Dim syntaxGenerator = Editing.SyntaxGenerator.GetGenerator(workspace, LanguageNames.VisualBasic)
- Return (New LinqToVisualBasicSyntaxTranslator(syntaxGenerator), workspace)
- End Function
-
- Private Shared ReadOnly ReturnsIntWithParamMethod As MethodInfo =
- GetType(LinqToVisualBasicTranslatorTest).GetMethod(NameOf(ReturnsIntWithParam))
-
- Public Shared Function ReturnsIntWithParam(i As Integer) As Integer
- Return i + 1
- End Function
-
- Private Shared ReadOnly GenericMethod As MethodInfo =
- GetType(LinqToVisualBasicTranslatorTest).GetMethods().Single(Function(m) m.Name = NameOf(GenericMethodImplementation))
-
- Public Shared Function GenericMethodImplementation(Of T)(value As T) As Integer
- Return 0
- End Function
-
- Private Shared ReadOnly FooMethod As MethodInfo =
- GetType(LinqToVisualBasicTranslatorTest).GetMethod(NameOf(Foo))
-
- Public Shared Function Foo() As Integer
- Return 1
- End Function
-
- Private Shared ReadOnly BarMethod As MethodInfo =
- GetType(LinqToVisualBasicTranslatorTest).GetMethod(NameOf(Bar))
-
- Public Shared Function Bar() As Integer
- Return 1
- End Function
-
- Private Shared ReadOnly BazMethod As MethodInfo =
- GetType(LinqToVisualBasicTranslatorTest).GetMethod(NameOf(Baz))
-
- Public Shared Function Baz() As Integer
- Return 1
- End Function
-
- Public Shared Function MethodWithSixParams(a%, b%, c%, d%, e%, f%) As Integer
- Return a + b + c + d + e + f
- End Function
-
- Private Class Blog
-
- Public PublicField As Integer
- Public Property PublicProperty As Integer
-
- Friend InternalField As Integer
- Friend Property InternalProperty As Integer
-
- Private _privateField As Integer
- Private Property PrivateProperty As Integer
-
- Public Property ListOfInts As New List(Of Integer)
- Public Property Details As New BlogDetails
-
- Public Sub New() : End Sub
- Public Sub New(name As String) : End Sub
- Public Sub New(foo As Integer, bar As Integer) : End Sub
-
- Public Function SomeInstanceMethod() As Integer
- Return 3
- End Function
-
- Public Shared ReadOnly Constructor As ConstructorInfo =
- GetType(Blog).GetConstructor(Array.Empty(Of Type)())
-
- Public Shared Function Static_method_on_nested_type() As Integer
- Return 3
- End Function
- End Class
-
- Public Class BlogDetails
- Public Property Foo As Integer
- Public Property ListOfInts As New List(Of Integer)
- End Class
-
-
- Public Enum SomeEnum
- One = 1
- Two = 2
- End Enum
-
- Private ReadOnly _expressionPrinter As New ExpressionPrinter
- Private ReadOnly _outputExpressionTrees As Boolean
- End Class
-
- Friend Class LinqExpressionToRoslynTranslatorExtensionType
-
- Public Shared ReadOnly Constructor As ConstructorInfo =
- GetType(LinqExpressionToRoslynTranslatorExtensionType).GetConstructor(Array.Empty(Of Type)())
- End Class
-
- Friend Module LinqExpressionToRoslynTranslatorExtensions
- Public ReadOnly SomeExtensionMethod As MethodInfo =
- GetType(LinqExpressionToRoslynTranslatorExtensions).GetMethod(
- NameOf(SomeExtension), {GetType(LinqExpressionToRoslynTranslatorExtensionType)})
-
-
- Public Function SomeExtension(someType As LinqExpressionToRoslynTranslatorExtensionType) As Integer
- Return 3
- End Function
- End Module
-End Namespace
diff --git a/Test/EFCore.VisualBasic.Test/EFCore.VisualBasic.Test.vbproj b/Test/EFCore.VisualBasic.Test/EFCore.VisualBasic.Test.vbproj
index 50a689a..be99464 100644
--- a/Test/EFCore.VisualBasic.Test/EFCore.VisualBasic.Test.vbproj
+++ b/Test/EFCore.VisualBasic.Test/EFCore.VisualBasic.Test.vbproj
@@ -25,7 +25,7 @@
-
+
all
diff --git a/Test/EFCore.VisualBasic.Test/Scaffolding/Internal/VisualBasicRuntimeModelCodeGeneratorTest.vb b/Test/EFCore.VisualBasic.Test/Scaffolding/Internal/VisualBasicRuntimeModelCodeGeneratorTest.vb
deleted file mode 100644
index ad4a7cf..0000000
--- a/Test/EFCore.VisualBasic.Test/Scaffolding/Internal/VisualBasicRuntimeModelCodeGeneratorTest.vb
+++ /dev/null
@@ -1,63575 +0,0 @@
-Imports System.ComponentModel
-Imports System.ComponentModel.DataAnnotations.Schema
-Imports System.Data
-Imports System.Linq.Expressions
-Imports System.Net
-Imports System.Net.NetworkInformation
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Design
-Imports EntityFrameworkCore.VisualBasic.Design.AnnotationCodeGeneratorProvider
-Imports EntityFrameworkCore.VisualBasic.Design.Internal
-Imports EntityFrameworkCore.VisualBasic.Migrations.Design.VisualBasicMigrationsGeneratorTests
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.ChangeTracking.Internal
-Imports Microsoft.EntityFrameworkCore.Cosmos.ValueGeneration.Internal
-Imports Microsoft.EntityFrameworkCore.Design
-Imports Microsoft.EntityFrameworkCore.Diagnostics
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Builders
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Query.SqlExpressions
-Imports Microsoft.EntityFrameworkCore.Scaffolding
-Imports Microsoft.EntityFrameworkCore.Sqlite.Design.Internal
-Imports Microsoft.EntityFrameworkCore.SqlServer.Design.Internal
-Imports Microsoft.EntityFrameworkCore.SqlServer.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.EntityFrameworkCore.Storage.ValueConversion
-Imports Microsoft.EntityFrameworkCore.ValueGeneration.Internal
-Imports Microsoft.Extensions.DependencyInjection
-Imports NetTopologySuite
-Imports NetTopologySuite.Geometries
-Imports Newtonsoft.Json.Linq
-Imports Xunit
-
-Namespace Global
- Public Class GlobalNamespaceContext
- Inherits ContextBase
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity("1",
- Sub(e)
- e.Property(Of Integer)("Id")
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-End Namespace
-
-Namespace Scaffolding.Internal
- Public Class VisualBasicRuntimeModelCodeGeneratorTest
-
-
- Public Sub Self_referential_property()
- Test(New TestModel.Internal.SelfReferentialDbContext(),
- CreateCompiledModelCodeGenerationOptions(),
- assertModel:=Sub(Model)
- Assert.Single(Model.GetEntityTypes())
- Assert.Same(Model, Model.FindRuntimeAnnotationValue("ReadOnlyModel"))
- End Sub
- )
- End Sub
-
-
- Public Sub Empty_model()
-
- Dim rm1 As String =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class EmptyContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As EmptyContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New EmptyContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 As String =
-
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class EmptyContextModel
-
- Private Sub Initialize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Test(New EmptyContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("EmptyContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("EmptyContextModelBuilder.vb", rm2, c))
- End Sub,
- Sub(Model)
- Assert.Empty(Model.GetEntityTypes())
- Assert.Same(Model, Model.FindRuntimeAnnotationValue("ReadOnlyModel"))
- End Sub)
- End Sub
-
- Public Class EmptyContext
- Inherits ContextBase
- End Class
-
-
- Public Sub Global_Namespace_works()
- Test(New GlobalNamespaceContext(),
- New CompiledModelCodeGenerationOptions With {
- .Language = "VB",
- .ModelNamespace = String.Empty
- },
- Sub(code)
- Assert.All(code, Sub(f) Assert.DoesNotContain("Namespace ", f.Code))
- End Sub,
- Sub(Model)
- Assert.NotNull(Model.FindEntityType("1"))
- End Sub)
- End Sub
-
-
- Public Sub Throws_for_constructor_binding()
- Test(
- New ConstructorBindingContext(),
- CreateCompiledModelCodeGenerationOptions(),
- expectedExceptionMessage:=DesignStrings.CompiledModelConstructorBinding("Lazy", "Customize()", "LazyEntityType"))
- End Sub
-
- Public Class ConstructorBindingContext
- Inherits ContextBase
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "Lazy", Sub(e)
- e.Property(Of Integer)("Id")
- e.HasKey("Id")
- DirectCast(e.Metadata, EntityType).ConstructorBinding = New ConstructorBinding(
- GetType(Object).GetConstructor(Type.EmptyTypes),
- Array.Empty(Of ParameterBinding)())
- End Sub)
- End Sub
-
- Protected Overrides Sub OnConfiguring(options As DbContextOptionsBuilder)
- MyBase.OnConfiguring(options.UseLazyLoadingProxies())
- End Sub
- End Class
-
-
- Public Sub Manual_lazy_loading()
- Test(
- New LazyLoadingContext(),
- CreateCompiledModelCodeGenerationOptions(),
- assertModel:=
- Sub(Model)
- Dim lazyConstructorEntity = Model.FindEntityType(GetType(LazyConstructorEntity))
- Dim lazyParameterBinding = lazyConstructorEntity.ConstructorBinding.ParameterBindings.Single()
- Assert.Equal(GetType(ILazyLoader), lazyParameterBinding.ParameterType)
-
- Dim lazyPropertyEntity = Model.FindEntityType(GetType(LazyPropertyEntity))
- Dim lazyServiceProperty = lazyPropertyEntity.GetServiceProperties().Single()
- Assert.Equal(GetType(ILazyLoader), lazyServiceProperty.ClrType)
-
- Dim lazyPropertyDelegateEntity = Model.FindEntityType(GetType(LazyPropertyDelegateEntity))
- Assert.Equal(2, lazyPropertyDelegateEntity.GetServiceProperties().Count())
- Assert.Contains(lazyPropertyDelegateEntity.GetServiceProperties(), Function(p) p.ClrType = GetType(ILazyLoader))
- Assert.Contains(lazyPropertyDelegateEntity.GetServiceProperties(), Function(p) p.ClrType = GetType(Action(Of Object, String)))
- End Sub)
- End Sub
-
- Public Class LazyLoadingContext
- Inherits ContextBase
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(Of LazyConstructorEntity)()
-
- modelBuilder.Entity(Of LazyPropertyDelegateEntity)(
- Sub(b)
- Dim ServiceProperty = DirectCast(b.Metadata.AddServiceProperty(
- GetType(LazyPropertyDelegateEntity).GetAnyProperty("LoaderState"),
- GetType(ILazyLoader)),
- ServiceProperty)
-
- ServiceProperty.SetParameterBinding(
- New DependencyInjectionParameterBinding(GetType(Object), GetType(ILazyLoader), ServiceProperty),
- ConfigurationSource.Explicit)
- End Sub)
- End Sub
- End Class
-
- Public Class LazyConstructorEntity
- Private ReadOnly _loader As ILazyLoader
-
- Public Sub New(loader As ILazyLoader)
- _loader = loader
- End Sub
-
- Public Property Id As Integer
-
- Public Property LazyPropertyEntity As LazyPropertyEntity
- Public Property LazyPropertyDelegateEntity As LazyPropertyDelegateEntity
- End Class
-
- Public Class LazyPropertyEntity
- Public Property Loader As ILazyLoader
- Public Property Id As Integer
- Public Property LazyConstructorEntityId As Integer
-
- Public Property LazyConstructorEntity As LazyConstructorEntity
- End Class
-
- Public Class LazyPropertyDelegateEntity
- Public Property LoaderState As Object
- Private Property LazyLoader As Action(Of Object, String)
-
- Public Property Id As Integer
- Public Property LazyConstructorEntityId As Integer
-
- Public Property LazyConstructorEntity As LazyConstructorEntity
- End Class
-
-
- Public Sub Lazy_loading_proxies()
- Test(
- New LazyLoadingProxiesContext(),
- CreateCompiledModelCodeGenerationOptions(),
- assertModel:=
- Sub(Model)
- Assert.Equal(
- GetType(ILazyLoader), Model.FindEntityType(GetType(LazyProxiesEntity1)).GetServiceProperties().Single().ClrType)
- Assert.Equal(
- GetType(ILazyLoader), Model.FindEntityType(GetType(LazyProxiesEntity1)).GetServiceProperties().Single().ClrType)
- End Sub)
- End Sub
-
- Public Class LazyLoadingProxiesContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(Of LazyProxiesEntity1)()
- End Sub
-
- Protected Overrides Sub OnConfiguring(options As DbContextOptionsBuilder)
- MyBase.OnConfiguring(options.UseLazyLoadingProxies())
- End Sub
- End Class
-
- Public Class LazyProxiesEntity1
- Public Property Id As Integer
-
- Public Overridable Property ReferenceNavigation As LazyProxiesEntity2
- End Class
-
- Public Class LazyProxiesEntity2
- Public Property Loader As ILazyLoader
-
- Public Property Id As Integer
- Public Overridable Property CollectionNavigation As ICollection(Of LazyProxiesEntity1)
- End Class
-
-
- Public Sub Throws_for_query_filter()
- Test(New QueryFilterContext(),
- CreateCompiledModelCodeGenerationOptions(),
- expectedExceptionMessage:=DesignStrings.CompiledModelQueryFilter("QueryFilter"))
- End Sub
-
- Public Class QueryFilterContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "QueryFilter", Sub(e)
- e.Property(Of Integer)("Id")
- e.HasKey("Id")
- e.HasQueryFilter(DirectCast(Function(x) x IsNot Nothing, Expression(Of Func(Of Dictionary(Of String, Object), Boolean))))
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Throws_for_defining_query()
- Test(
- New DefiningQueryContext(),
- CreateCompiledModelCodeGenerationOptions(),
- expectedExceptionMessage:=DesignStrings.CompiledModelDefiningQuery("object"))
- End Sub
-
- Public Class DefiningQueryContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- Dim expr As Expression(Of Func(Of IQueryable(Of Object))) =
- Function() DirectCast([Set](Of Object)(), IQueryable(Of Object))
-
- modelBuilder.Entity(Of Object)(Sub(e)
- e.Property(Of Integer)("Id")
- e.HasKey("Id")
- e.Metadata.SetInMemoryQuery(expr)
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Throws_for_value_generator()
- Test(
- New ValueGeneratorContext(),
- CreateCompiledModelCodeGenerationOptions(),
- expectedExceptionMessage:=DesignStrings.CompiledModelValueGenerator(
- "MyEntity", "Id", NameOf(PropertyBuilder.HasValueGeneratorFactory)))
- End Sub
-
- Public Class ValueGeneratorContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "MyEntity", Sub(e)
- e.Property(Of Integer)("Id").
- HasValueGenerator(Function(p, en) Nothing)
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Custom_value_converter()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class ValueConverterContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As ValueConverterContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New ValueConverterContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class ValueConverterContextModel
-
- Private Sub Initialize()
- Dim myEntity = MyEntityEntityType.Create(Me)
-
- MyEntityEntityType.CreateAnnotations(myEntity)
-
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e1 =
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.EntityFrameworkCore.Storage.ValueConversion
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Friend Partial Class MyEntityEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "MyEntity",
- GetType(Dictionary(Of String, Object)),
- baseEntityType,
- sharedClrType:=True,
- indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(GetType(Dictionary(Of String, Object))),
- propertyBag:=True)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Integer),
- propertyInfo:=entityType.FindIndexerPropertyInfo(),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw)
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- Type.Missing,
- New ValueConverter(Of Integer, Integer)(
- Function(i As Integer) i,
- Function(i As Integer) i),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- Type.Missing,
- New JsonConvertedValueReaderWriter(Of Integer, Integer)(
- JsonInt32ReaderWriter.Instance,
- New ValueConverter(Of Integer, Integer)(
- Function(i As Integer) i,
- Function(i As Integer) i))}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Test(New ValueConverterContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("ValueConverterContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("ValueConverterContextModelBuilder.vb", rm2, c),
- Sub(c) AssertFileContents("MyEntityEntityType.vb", e1, c))
- End Sub,
- Sub(model)
- Dim EntityType = model.GetEntityTypes().Single()
-
- Dim Converter = EntityType.FindProperty("Id").GetTypeMapping().Converter
- Assert.Equal(1, Converter.ConvertToProvider(1))
- End Sub)
- End Sub
-
- Public Class ValueConverterContext
- Inherits ContextBase
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "MyEntity", Sub(e)
- e.Property(Of Integer)("Id").HasConversion(Function(i) i, Function(i) i)
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Custom_value_comparer()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class ValueComparerContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As ValueComparerContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New ValueComparerContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class ValueComparerContextModel
-
- Private Sub Initialize()
- Dim myEntity = MyEntityEntityType.Create(Me)
-
- MyEntityEntityType.CreateAnnotations(myEntity)
-
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e1 =
-
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Friend Partial Class MyEntityEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "MyEntity",
- GetType(Dictionary(Of String, Object)),
- baseEntityType,
- sharedClrType:=True,
- indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(GetType(Dictionary(Of String, Object))),
- propertyBag:=True)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Integer),
- propertyInfo:=entityType.FindIndexerPropertyInfo(),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw,
- providerPropertyType:=GetType(Integer))
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Integer),
- Type.Missing,
- New ValueComparer(Of Integer)(
- Function(l As Integer, r As Integer) False,
- Function(v As Integer) 0,
- Function(v As Integer) 1),
- New ValueComparer(Of Integer)(
- Function(l As Integer, r As Integer) False,
- Function(v As Integer) 0,
- Function(v As Integer) 1),
- New ValueComparer(Of Integer)(
- Function(l As Integer, r As Integer) False,
- Function(v As Integer) 0,
- Function(v As Integer) 1),
- Type.Missing,
- JsonInt32ReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
-
- Test(New ValueComparerContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("ValueComparerContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("ValueComparerContextModelBuilder.vb", rm2, c),
- Sub(c) AssertFileContents("MyEntityEntityType.vb", e1, c))
- End Sub,
- Sub(model)
- Dim entityType = model.GetEntityTypes().Single()
-
- Dim lambda = TryCast(entityType.FindProperty("Id").GetValueComparer().SnapshotExpression, Expression(Of Func(Of Integer, Integer)))
- Dim constant = TryCast(lambda?.Body, ConstantExpression)
- Assert.True(lambda IsNot Nothing AndAlso constant IsNot Nothing AndAlso CInt(constant.Value) = 1)
- End Sub)
- End Sub
-
- Public Class ValueComparerContext
- Inherits ContextBase
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
-
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "MyEntity", Sub(e)
- e.Property(Of Integer)("Id").
- HasConversion(GetType(Integer), New FakeValueComparer())
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-
- Private Class FakeValueComparer
- Inherits ValueComparer(Of Integer)
-
- Public Sub New()
- MyBase.New(Function(l, r) False, Function(v) 0, Function(v) 1)
- End Sub
-
- Public Overrides ReadOnly Property Type As Type = GetType(Integer)
-
- Public Overrides Function Equals(left As Object, right As Object) As Boolean
- Throw New NotImplementedException()
- End Function
-
- Public Overrides Function GetHashCode(instance As Object) As Integer
- Throw New NotImplementedException()
- End Function
-
- Public Overrides Function Snapshot(instance As Object) As Object
- Throw New NotImplementedException()
- End Function
- End Class
-
-
- Public Sub Custom_provider_value_comparer()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class ProviderValueComparerContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As ProviderValueComparerContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New ProviderValueComparerContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class ProviderValueComparerContextModel
-
- Private Sub Initialize()
- Dim myEntity = MyEntityEntityType.Create(Me)
-
- MyEntityEntityType.CreateAnnotations(myEntity)
-
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e1 =
-
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Friend Partial Class MyEntityEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "MyEntity",
- GetType(Dictionary(Of String, Object)),
- baseEntityType,
- sharedClrType:=True,
- indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(GetType(Dictionary(Of String, Object))),
- propertyBag:=True)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Integer),
- propertyInfo:=entityType.FindIndexerPropertyInfo(),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw,
- providerPropertyType:=GetType(Integer))
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Integer),
- Type.Missing,
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(l As Integer, r As Integer) False,
- Function(v As Integer) 0,
- Function(v As Integer) 1),
- Type.Missing,
- JsonInt32ReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Test(
- New ProviderValueComparerContext,
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("ProviderValueComparerContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("ProviderValueComparerContextModelBuilder.vb", rm2, c),
- Sub(c) AssertFileContents("MyEntityEntityType.vb", e1, c))
- End Sub,
- Sub(model)
- Dim entityType = model.GetEntityTypes().Single()
-
- Dim lambda = TryCast(entityType.FindProperty("Id").GetProviderValueComparer().SnapshotExpression, Expression(Of Func(Of Integer, Integer)))
- Dim constant = TryCast(lambda?.Body, ConstantExpression)
-
- Assert.True(lambda IsNot Nothing AndAlso constant IsNot Nothing AndAlso CInt(constant.Value) = 1)
- End Sub)
- End Sub
-
- Public Class ProviderValueComparerContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "MyEntity",
- Sub(e)
- e.Property(Of Integer)("Id").HasConversion(GetType(Integer), Nothing, New FakeValueComparer())
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Custom_type_mapping()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class TypeMappingContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As TypeMappingContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New TypeMappingContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class TypeMappingContextModel
-
- Private Sub Initialize()
- Dim myEntity = MyEntityEntityType.Create(Me)
-
- MyEntityEntityType.CreateAnnotations(myEntity)
-
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e1 =
-
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Friend Partial Class MyEntityEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "MyEntity",
- GetType(Dictionary(Of String, Object)),
- baseEntityType,
- sharedClrType:=True,
- indexerPropertyInfo:=RuntimeEntityType.FindIndexerProperty(GetType(Dictionary(Of String, Object))),
- propertyBag:=True)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Integer),
- propertyInfo:=entityType.FindIndexerPropertyInfo(),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw)
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Integer),
- Type.Missing,
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- Type.Missing,
- JsonInt32ReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Test(
- New TypeMappingContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("TypeMappingContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("TypeMappingContextModelBuilder.vb", rm2, c),
- Sub(c) AssertFileContents("MyEntityEntityType.vb", e1, c))
- End Sub,
- Sub(model)
- Dim entityType = model.GetEntityTypes().Single()
-
- Dim typeMapping = entityType.FindProperty("Id").FindTypeMapping()
- Assert.IsType(Of InMemoryTypeMapping)(typeMapping)
- Assert.IsType(Of JsonInt32ReaderWriter)(typeMapping.JsonValueReaderWriter)
- End Sub)
- End Sub
-
- Public Class TypeMappingContext
- Inherits ContextBase
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.Entity(
- "MyEntity",
- Sub(e)
- e.Property(Of Integer)("Id").Metadata.SetTypeMapping(
- New InMemoryTypeMapping(GetType(Integer), jsonValueReaderWriter:=JsonInt32ReaderWriter.Instance))
- e.HasKey("Id")
- End Sub)
- End Sub
- End Class
-
-
- Public Sub Custom_function_type_mapping()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class FunctionTypeMappingContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As FunctionTypeMappingContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New FunctionTypeMappingContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class FunctionTypeMappingContextModel
-
- Private Sub Initialize()
- Dim functions As New SortedDictionary(Of String, IDbFunction)()
- Dim getSqlFragmentShared As New RuntimeDbFunction(
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionTypeMappingContext.GetSqlFragmentShared(string)",
- Me,
- GetType(String),
- "GetSqlFragmentShared",
- schema:="dbo",
- storeType:="varchar",
- methodInfo:=GetType(VisualBasicRuntimeModelCodeGeneratorTest.FunctionTypeMappingContext).GetMethod(
- "GetSqlFragmentShared",
- BindingFlags.Public Or BindingFlags.Static Or BindingFlags.DeclaredOnly,
- Nothing,
- {GetType(String)},
- Nothing),
- scalar:=True,
- nullable:=True)
-
- Dim param = getSqlFragmentShared.AddParameter(
- "param",
- GetType(String),
- False,
- "nvarchar(max)")
- param.TypeMapping = DirectCast(GetType(RelationalTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(SqlServerStringTypeMapping.Default, {
- New RelationalTypeMappingInfo(
- storeTypeName:="nvarchar(max)",
- unicode:=True,
- dbType:=System.Data.DbType.String),
- Type.Missing,
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- Type.Missing,
- StoreTypePostfix.None}), CoreTypeMapping)
-
- getSqlFragmentShared.TypeMapping = DirectCast(GetType(RelationalTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(StringTypeMapping.Default, {
- New RelationalTypeMappingInfo(
- storeTypeName:="varchar",
- dbType:=System.Data.DbType.AnsiString),
- Type.Missing,
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- Type.Missing,
- Type.Missing}), CoreTypeMapping)
- functions("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionTypeMappingContext.GetSqlFragmentShared(string)") = getSqlFragmentShared
-
- AddAnnotation("Relational:DbFunctions", functions)
- AddAnnotation("Relational:MaxIdentifierLength", 128)
- AddAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
- AddRuntimeAnnotation("Relational:RelationalModel", CreateRelationalModel())
- End Sub
-
- Private Function CreateRelationalModel() As IRelationalModel
- Dim relationalModel As New RelationalModel(Me)
- Dim getSqlFragmentShared = DirectCast(Me.FindDbFunction("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionTypeMappingContext.GetSqlFragmentShared(string)"), IRuntimeDbFunction)
- Dim getSqlFragmentSharedFunction As New StoreFunction(getSqlFragmentShared, relationalModel)
- Dim paramFunctionParameter = getSqlFragmentSharedFunction.FindParameter("param")
- relationalModel.Functions.Add(
- ("GetSqlFragmentShared", "dbo", {"nvarchar(max)"}),
- getSqlFragmentSharedFunction)
- Return relationalModel.MakeReadOnly()
- End Function
- End Class
-End Namespace
-]]>.Value
-
- Test(
- New FunctionTypeMappingContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("FunctionTypeMappingContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("FunctionTypeMappingContextModelBuilder.vb", rm2, c))
- End Sub,
- Sub(model)
- Dim [function] = model.GetDbFunctions().Single()
-
- Dim typeMapping = [function].TypeMapping
- Assert.IsType(Of StringTypeMapping)(typeMapping)
- Assert.Equal("varchar", typeMapping.StoreType)
- End Sub)
- End Sub
-
- Public Class FunctionTypeMappingContext
- Inherits SqlServerContextBase
-
- Public Shared Function GetSqlFragmentShared(param As String) As String
- Throw New NotImplementedException()
- End Function
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.
- HasDbFunction(GetType(FunctionTypeMappingContext).
- GetMethod(NameOf(GetSqlFragmentShared))).
- Metadata.TypeMapping = New StringTypeMapping("varchar", DbType.AnsiString)
- End Sub
- End Class
-
-
- Public Sub Custom_function_parameter_type_mapping()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class FunctionParameterTypeMappingContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As FunctionParameterTypeMappingContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New FunctionParameterTypeMappingContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports System
-Imports System.Collections.Generic
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class FunctionParameterTypeMappingContextModel
-
- Private Sub Initialize()
- Dim functions As New SortedDictionary(Of String, IDbFunction)()
- Dim getSqlFragmentShared As New RuntimeDbFunction(
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionParameterTypeMappingContext.GetSqlFragmentShared(string)",
- Me,
- GetType(String),
- "GetSqlFragmentShared",
- schema:="dbo",
- storeType:="nvarchar(max)",
- methodInfo:=GetType(VisualBasicRuntimeModelCodeGeneratorTest.FunctionParameterTypeMappingContext).GetMethod(
- "GetSqlFragmentShared",
- BindingFlags.Public Or BindingFlags.Static Or BindingFlags.DeclaredOnly,
- Nothing,
- {GetType(String)},
- Nothing),
- scalar:=True,
- nullable:=True)
-
- Dim param = getSqlFragmentShared.AddParameter(
- "param",
- GetType(String),
- False,
- "varchar")
- param.TypeMapping = DirectCast(GetType(RelationalTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(StringTypeMapping.Default, {
- New RelationalTypeMappingInfo(
- storeTypeName:="varchar",
- dbType:=System.Data.DbType.AnsiString),
- Type.Missing,
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- Type.Missing,
- Type.Missing}), CoreTypeMapping)
-
- getSqlFragmentShared.TypeMapping = DirectCast(GetType(RelationalTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(SqlServerStringTypeMapping.Default, {
- New RelationalTypeMappingInfo(
- storeTypeName:="nvarchar(max)",
- unicode:=True,
- dbType:=System.Data.DbType.String),
- Type.Missing,
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- Type.Missing,
- StoreTypePostfix.None}), CoreTypeMapping)
- functions("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionParameterTypeMappingContext.GetSqlFragmentShared(string)") = getSqlFragmentShared
-
- AddAnnotation("Relational:DbFunctions", functions)
- AddAnnotation("Relational:MaxIdentifierLength", 128)
- AddAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
- AddRuntimeAnnotation("Relational:RelationalModel", CreateRelationalModel())
- End Sub
-
- Private Function CreateRelationalModel() As IRelationalModel
- Dim relationalModel As New RelationalModel(Me)
- Dim getSqlFragmentShared = DirectCast(Me.FindDbFunction("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+FunctionParameterTypeMappingContext.GetSqlFragmentShared(string)"), IRuntimeDbFunction)
- Dim getSqlFragmentSharedFunction As New StoreFunction(getSqlFragmentShared, relationalModel)
- Dim paramFunctionParameter = getSqlFragmentSharedFunction.FindParameter("param")
- relationalModel.Functions.Add(
- ("GetSqlFragmentShared", "dbo", {"varchar"}),
- getSqlFragmentSharedFunction)
- Return relationalModel.MakeReadOnly()
- End Function
- End Class
-End Namespace
-]]>.Value
-
- Test(
- New FunctionParameterTypeMappingContext(),
- CreateCompiledModelCodeGenerationOptions(),
- Sub(code)
- Assert.
- Collection(code,
- Sub(c) AssertFileContents("FunctionParameterTypeMappingContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("FunctionParameterTypeMappingContextModelBuilder.vb", rm2, c))
- End Sub,
- Sub(model)
- Dim [function] = model.GetDbFunctions().Single()
- Dim parameter = [function].Parameters.Single()
-
- Dim typeMapping = parameter.TypeMapping
- Assert.IsType(Of StringTypeMapping)(typeMapping)
- Assert.Equal("varchar", typeMapping.StoreType)
- End Sub)
- End Sub
-
- Public Class FunctionParameterTypeMappingContext
- Inherits SqlServerContextBase
-
- Public Shared Function GetSqlFragmentShared(param As String) As String
- Throw New NotImplementedException()
- End Function
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.
- HasDbFunction(GetType(FunctionParameterTypeMappingContext).
- GetMethod(NameOf(GetSqlFragmentShared))).
- HasParameter("param").Metadata.TypeMapping = New StringTypeMapping("varchar", DbType.AnsiString)
- End Sub
- End Class
-
-
- Public Sub Throws_for_custom_function_translation()
- Test(
- New FunctionTranslationContext(),
- New CompiledModelCodeGenerationOptions(),
- expectedExceptionMessage:=RelationalStrings.CompiledModelFunctionTranslation("GetSqlFragmentStatic"))
- End Sub
-
- Public Class FunctionTranslationContext
- Inherits SqlServerContextBase
-
- Public Shared Function GetSqlFragmentStatic() As String
- Throw New NotImplementedException()
- End Function
-
- Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
- MyBase.OnModelCreating(modelBuilder)
-
- modelBuilder.HasDbFunction(GetType(FunctionTranslationContext).GetMethod(NameOf(GetSqlFragmentStatic))).
- HasTranslation(Function(args) New SqlFragmentExpression("NULL"))
- End Sub
- End Class
-
-
- Public Sub Fully_qualified_model()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.TestModel.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace Internal
-
- Public Partial Class DbContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As DbContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New DbContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim DbContext =
-
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace Internal
- Public Partial Class DbContextModel
-
- Private Sub Initialize()
- Dim index = IndexEntityType.Create(Me)
- Dim internal = InternalEntityType.Create(Me)
- Dim identityUser = IdentityUserEntityType.Create(Me)
- Dim identityUser0 = IdentityUser0EntityType.Create(Me, identityUser)
-
- IndexEntityType.CreateAnnotations(index)
- InternalEntityType.CreateAnnotations(internal)
- IdentityUserEntityType.CreateAnnotations(identityUser)
- IdentityUser0EntityType.CreateAnnotations(identityUser0)
-
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e1 =
-
-Imports System
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.VisualBasic
-
-Namespace Internal
- Friend Partial Class IndexEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Index",
- GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Index),
- baseEntityType)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Guid),
- propertyInfo:=GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Index).GetProperty("Id", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Index).GetField("_Id", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw,
- sentinel:=New Guid("00000000-0000-0000-0000-000000000000"))
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Guid),
- Type.Missing,
- New ValueComparer(Of Guid)(
- Function(v1 As Guid, v2 As Guid) v1 = v2,
- Function(v As Guid) v.GetHashCode(),
- Function(v As Guid) v),
- New ValueComparer(Of Guid)(
- Function(v1 As Guid, v2 As Guid) v1 = v2,
- Function(v As Guid) v.GetHashCode(),
- Function(v As Guid) v),
- New ValueComparer(Of Guid)(
- Function(v1 As Guid, v2 As Guid) v1 = v2,
- Function(v As Guid) v.GetHashCode(),
- Function(v As Guid) v),
- Type.Missing,
- JsonGuidReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e2 =
-
-Imports System
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.VisualBasic
-
-Namespace Internal
- Friend Partial Class InternalEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Internal",
- GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Internal),
- baseEntityType)
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(Long),
- propertyInfo:=GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Internal).GetProperty("Id", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(EntityFrameworkCore.VisualBasic.Scaffolding.Internal.Internal).GetField("_Id", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- valueGenerated:=ValueGenerated.OnAdd,
- afterSaveBehavior:=PropertySaveBehavior.Throw,
- sentinel:=0L)
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Long),
- Type.Missing,
- New ValueComparer(Of Long)(
- Function(v1 As Long, v2 As Long) v1 = v2,
- Function(v As Long) v.GetHashCode(),
- Function(v As Long) v),
- New ValueComparer(Of Long)(
- Function(v1 As Long, v2 As Long) v1 = v2,
- Function(v As Long) v.GetHashCode(),
- Function(v As Long) v),
- New ValueComparer(Of Long)(
- Function(v1 As Long, v2 As Long) v1 = v2,
- Function(v As Long) v.GetHashCode(),
- Function(v As Long) v),
- Type.Missing,
- JsonInt64ReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e3 =
-
-Imports System
-Imports System.Reflection
-Imports Microsoft.EntityFrameworkCore.ChangeTracking
-Imports Microsoft.EntityFrameworkCore.InMemory.Storage.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Storage
-Imports Microsoft.EntityFrameworkCore.Storage.Json
-Imports Microsoft.EntityFrameworkCore.TestModels.AspNetIdentity
-Imports Microsoft.EntityFrameworkCore.ValueGeneration
-Imports Microsoft.VisualBasic
-
-Namespace Internal
- Friend Partial Class IdentityUserEntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "Microsoft.EntityFrameworkCore.TestModels.AspNetIdentity.IdentityUser",
- GetType(IdentityUser),
- baseEntityType,
- discriminatorProperty:="Discriminator",
- discriminatorValue:="IdentityUser")
-
- Dim id = entityType.AddProperty(
- "Id",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("Id", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- afterSaveBehavior:=PropertySaveBehavior.Throw)
- id.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim accessFailedCount = entityType.AddProperty(
- "AccessFailedCount",
- GetType(Integer),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("AccessFailedCount", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- sentinel:=0)
- accessFailedCount.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Integer),
- Type.Missing,
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- New ValueComparer(Of Integer)(
- Function(v1 As Integer, v2 As Integer) v1 = v2,
- Function(v As Integer) v,
- Function(v As Integer) v),
- Type.Missing,
- JsonInt32ReaderWriter.Instance}), CoreTypeMapping)
-
- Dim concurrencyStamp = entityType.AddProperty(
- "ConcurrencyStamp",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("ConcurrencyStamp", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- concurrencyStamp.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim discriminator = entityType.AddProperty(
- "Discriminator",
- GetType(String),
- afterSaveBehavior:=PropertySaveBehavior.Throw,
- valueGeneratorFactory:=AddressOf New DiscriminatorValueGeneratorFactory().Create)
- discriminator.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim email = entityType.AddProperty(
- "Email",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("Email", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- email.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim emailConfirmed = entityType.AddProperty(
- "EmailConfirmed",
- GetType(Boolean),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("EmailConfirmed", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- sentinel:=False)
- emailConfirmed.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Boolean),
- Type.Missing,
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- Type.Missing,
- JsonBoolReaderWriter.Instance}), CoreTypeMapping)
-
- Dim lockoutEnabled = entityType.AddProperty(
- "LockoutEnabled",
- GetType(Boolean),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("LockoutEnabled", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- sentinel:=False)
- lockoutEnabled.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Boolean),
- Type.Missing,
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- Type.Missing,
- JsonBoolReaderWriter.Instance}), CoreTypeMapping)
-
- Dim lockoutEnd = entityType.AddProperty(
- "LockoutEnd",
- GetType(DateTimeOffset?),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("LockoutEnd", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- lockoutEnd.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(DateTimeOffset),
- Type.Missing,
- New ValueComparer(Of DateTimeOffset?)(
- Function(v1 As Nullable(Of DateTimeOffset), v2 As Nullable(Of DateTimeOffset)) v1.HasValue AndAlso v2.HasValue AndAlso CType(v1, DateTimeOffset).EqualsExact(CType(v2, DateTimeOffset)) OrElse Not(v1.HasValue) AndAlso Not(v2.HasValue),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(v, DateTimeOffset).GetHashCode(), 0),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(CType(v, DateTimeOffset), Nullable(Of DateTimeOffset)), CType(Nothing, Nullable(Of DateTimeOffset)))),
- New ValueComparer(Of DateTimeOffset?)(
- Function(v1 As Nullable(Of DateTimeOffset), v2 As Nullable(Of DateTimeOffset)) v1.HasValue AndAlso v2.HasValue AndAlso CType(v1, DateTimeOffset).EqualsExact(CType(v2, DateTimeOffset)) OrElse Not(v1.HasValue) AndAlso Not(v2.HasValue),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(v, DateTimeOffset).GetHashCode(), 0),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(CType(v, DateTimeOffset), Nullable(Of DateTimeOffset)), CType(Nothing, Nullable(Of DateTimeOffset)))),
- New ValueComparer(Of DateTimeOffset?)(
- Function(v1 As Nullable(Of DateTimeOffset), v2 As Nullable(Of DateTimeOffset)) v1.HasValue AndAlso v2.HasValue AndAlso CType(v1, DateTimeOffset).EqualsExact(CType(v2, DateTimeOffset)) OrElse Not(v1.HasValue) AndAlso Not(v2.HasValue),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(v, DateTimeOffset).GetHashCode(), 0),
- Function(v As Nullable(Of DateTimeOffset)) If(v.HasValue, CType(CType(v, DateTimeOffset), Nullable(Of DateTimeOffset)), CType(Nothing, Nullable(Of DateTimeOffset)))),
- Type.Missing,
- JsonDateTimeOffsetReaderWriter.Instance}), CoreTypeMapping)
-
- Dim normalizedEmail = entityType.AddProperty(
- "NormalizedEmail",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("NormalizedEmail", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- normalizedEmail.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim normalizedUserName = entityType.AddProperty(
- "NormalizedUserName",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("NormalizedUserName", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- normalizedUserName.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim passwordHash = entityType.AddProperty(
- "PasswordHash",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("PasswordHash", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- passwordHash.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim phoneNumber = entityType.AddProperty(
- "PhoneNumber",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("PhoneNumber", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- phoneNumber.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim phoneNumberConfirmed = entityType.AddProperty(
- "PhoneNumberConfirmed",
- GetType(Boolean),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("PhoneNumberConfirmed", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- sentinel:=False)
- phoneNumberConfirmed.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Boolean),
- Type.Missing,
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- Type.Missing,
- JsonBoolReaderWriter.Instance}), CoreTypeMapping)
-
- Dim securityStamp = entityType.AddProperty(
- "SecurityStamp",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("SecurityStamp", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- securityStamp.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim twoFactorEnabled = entityType.AddProperty(
- "TwoFactorEnabled",
- GetType(Boolean),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("TwoFactorEnabled", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- sentinel:=False)
- twoFactorEnabled.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(Boolean),
- Type.Missing,
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- New ValueComparer(Of Boolean)(
- Function(v1 As Boolean, v2 As Boolean) v1 = v2,
- Function(v As Boolean) v.GetHashCode(),
- Function(v As Boolean) v),
- Type.Missing,
- JsonBoolReaderWriter.Instance}), CoreTypeMapping)
-
- Dim userName = entityType.AddProperty(
- "UserName",
- GetType(String),
- propertyInfo:=GetType(IdentityUser(Of String)).GetProperty("UserName", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- fieldInfo:=GetType(IdentityUser(Of String)).GetField("k__BackingField", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly),
- nullable:=True)
- userName.TypeMapping = DirectCast(GetType(CoreTypeMapping).
- GetMethod("Clone", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly).
- Invoke(InMemoryTypeMapping.Default, {
- Type.Missing,
- GetType(String),
- Type.Missing,
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- New ValueComparer(Of String)(
- Function(v1 As String, v2 As String) v1 = v2,
- Function(v As String) v.GetHashCode(),
- Function(v As String) v),
- Type.Missing,
- JsonStringReaderWriter.Instance}), CoreTypeMapping)
-
- Dim key = entityType.AddKey(
- {id})
- entityType.SetPrimaryKey(key)
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim e4 =
-
-Imports System
-Imports System.Reflection
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace Internal
- Friend Partial Class IdentityUser0EntityType
-
- Public Shared Function Create(model As RuntimeModel, Optional baseEntityType As RuntimeEntityType = Nothing) As RuntimeEntityType
- Dim entityType = model.AddEntityType(
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.IdentityUser",
- GetType(IdentityUser),
- baseEntityType,
- discriminatorProperty:="Discriminator",
- discriminatorValue:="DerivedIdentityUser")
-
- Return entityType
- End Function
-
- Public Shared Sub CreateAnnotations(entityType As RuntimeEntityType)
-
- Customize(entityType)
- End Sub
-
- Shared Partial Private Sub Customize(entityType As RuntimeEntityType)
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim CompiledModelCodeGenerationOptions = CreateCompiledModelCodeGenerationOptions()
- CompiledModelCodeGenerationOptions.ModelNamespace = "Internal"
-
- Test(
- New TestModel.Internal.DbContext(),
- CompiledModelCodeGenerationOptions,
- Sub(code)
- Assert.Collection(
- code,
- Sub(c) AssertFileContents("DbContextModel.vb", rm1, c),
- Sub(c) AssertFileContents("DbContextModelBuilder.vb", DbContext, c),
- Sub(c) AssertFileContents("IndexEntityType.vb", e1, c),
- Sub(c) AssertFileContents("InternalEntityType.vb", e2, c),
- Sub(c) AssertFileContents("IdentityUserEntityType.vb", e3, c),
- Sub(c) AssertFileContents("IdentityUser0EntityType.vb", e4, c))
- End Sub,
- Sub(Model)
- Assert.Equal(4, Model.GetEntityTypes().Count())
- Assert.Same(Model, Model.FindRuntimeAnnotationValue("ReadOnlyModel"))
- End Sub,
- additionalDesignTimeServices:=GetType(FullyQualifiedDesignTimeServices))
- End Sub
-
- Private Class FullyQualifiedDesignTimeServices
- Implements IDesignTimeServices
- Public Sub ConfigureDesignTimeServices(serviceCollection As IServiceCollection) _
- Implements IDesignTimeServices.ConfigureDesignTimeServices
-
- serviceCollection.AddSingleton(Of IVisualBasicHelper, FullyQualifiedVisualBasicHelper)()
- End Sub
- End Class
-
- Private Class FullyQualifiedVisualBasicHelper
- Inherits VisualBasicHelper
-
- Public Sub New(typeMappingSource As ITypeMappingSource)
- MyBase.New(typeMappingSource)
- End Sub
-
- Protected Overrides Function ShouldUseFullName(type As Type) As Boolean
- Return MyBase.ShouldUseFullName(type)
- End Function
-
- Protected Overrides Function ShouldUseFullName(shortTypeName As String) As Boolean
- Return MyBase.ShouldUseFullName(shortTypeName) OrElse
- shortTypeName = NameOf(Index) OrElse
- shortTypeName = NameOf(Internal)
- End Function
- End Class
-
-
- Public Sub BigModel()
-
- Dim rm1 =
-
-Imports EntityFrameworkCore.VisualBasic.Scaffolding.Internal
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
-
- Public Partial Class BigContextModel
- Inherits RuntimeModel
-
- Private Shared ReadOnly _useOldBehavior31751 As Boolean
-
- Private Shared _Instance As BigContextModel
- Public Shared ReadOnly Property Instance As IModel
- Get
- Return _Instance
- End Get
- End Property
-
- Shared Sub New()
- Dim enabled31751 As Boolean
- _useOldBehavior31751 = System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", enabled31751) AndAlso enabled31751
-
- Dim model As New BigContextModel()
- If _useOldBehavior31751 Then
- model.Initialize()
- Else
- Dim thread = New System.Threading.Thread(Sub() model.Initialize(), 10 * 1024 * 1024)
- thread.Start()
- thread.Join()
- End If
-
- model.Customize()
- _Instance = model
- End Sub
-
- Partial Private Sub Initialize()
- End Sub
-
- Partial Private Sub Customize()
- End Sub
- End Class
-End Namespace
-]]>.Value
-
- Dim rm2 =
-
-Imports System
-Imports System.Collections.Generic
-Imports Microsoft.EntityFrameworkCore
-Imports Microsoft.EntityFrameworkCore.Infrastructure
-Imports Microsoft.EntityFrameworkCore.Metadata
-Imports Microsoft.EntityFrameworkCore.Metadata.Internal
-Imports Microsoft.EntityFrameworkCore.Migrations
-Imports Microsoft.VisualBasic
-
-Namespace TestNamespace
- Public Partial Class BigContextModel
-
- Private Sub Initialize()
- Dim dependentBase = DependentBaseEntityType.Create(Me)
- Dim manyTypes = ManyTypesEntityType.Create(Me)
- Dim principalBase = PrincipalBaseEntityType.Create(Me)
- Dim ownedType = OwnedTypeEntityType.Create(Me)
- Dim ownedType0 = OwnedType0EntityType.Create(Me)
- Dim principalBasePrincipalDerivedDependentBasebyte = PrincipalBasePrincipalDerivedDependentBasebyteEntityType.Create(Me)
- Dim dependentDerived = DependentDerivedEntityType.Create(Me, dependentBase)
- Dim principalDerived = PrincipalDerivedEntityType.Create(Me, principalBase)
-
- DependentBaseEntityType.CreateForeignKey1(dependentBase, principalBase)
- DependentBaseEntityType.CreateForeignKey2(dependentBase, principalDerived)
- OwnedTypeEntityType.CreateForeignKey1(ownedType, principalBase)
- OwnedTypeEntityType.CreateForeignKey2(ownedType, ownedType)
- OwnedType0EntityType.CreateForeignKey1(ownedType0, principalDerived)
- PrincipalBasePrincipalDerivedDependentBasebyteEntityType.CreateForeignKey1(principalBasePrincipalDerivedDependentBasebyte, principalDerived)
- PrincipalBasePrincipalDerivedDependentBasebyteEntityType.CreateForeignKey2(principalBasePrincipalDerivedDependentBasebyte, principalBase)
- PrincipalDerivedEntityType.CreateForeignKey1(principalDerived, principalBase)
-
- PrincipalBaseEntityType.CreateSkipNavigation1(principalBase, principalDerived, principalBasePrincipalDerivedDependentBasebyte)
- PrincipalDerivedEntityType.CreateSkipNavigation1(principalDerived, principalBase, principalBasePrincipalDerivedDependentBasebyte)
-
- DependentBaseEntityType.CreateAnnotations(dependentBase)
- ManyTypesEntityType.CreateAnnotations(manyTypes)
- PrincipalBaseEntityType.CreateAnnotations(principalBase)
- OwnedTypeEntityType.CreateAnnotations(ownedType)
- OwnedType0EntityType.CreateAnnotations(ownedType0)
- PrincipalBasePrincipalDerivedDependentBasebyteEntityType.CreateAnnotations(principalBasePrincipalDerivedDependentBasebyte)
- DependentDerivedEntityType.CreateAnnotations(dependentDerived)
- PrincipalDerivedEntityType.CreateAnnotations(principalDerived)
-
- AddAnnotation("Relational:MaxIdentifierLength", 128)
- AddAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
- AddRuntimeAnnotation("Relational:RelationalModel", CreateRelationalModel())
- End Sub
-
- Private Function CreateRelationalModel() As IRelationalModel
- Dim relationalModel As New RelationalModel(Me)
-
- Dim dependentBase = FindEntityType("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+DependentBase")
-
- Dim defaultTableMappings As New List(Of TableMappingBase(Of ColumnMappingBase))()
- dependentBase.SetRuntimeAnnotation("Relational:DefaultMappings", defaultTableMappings)
- Dim entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase As New TableBase("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+DependentBase", Nothing, relationalModel)
- Dim dataColumnBase As New ColumnBase(Of ColumnMappingBase)("Data", "char(20)", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase) With {
- .IsNullable = True
- }
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("Data", dataColumnBase)
- Dim enumDiscriminatorColumnBase As New ColumnBase(Of ColumnMappingBase)("EnumDiscriminator", "int", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase)
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("EnumDiscriminator", enumDiscriminatorColumnBase)
- Dim idColumnBase As New ColumnBase(Of ColumnMappingBase)("Id", "tinyint", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase) With {
- .IsNullable = True
- }
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("Id", idColumnBase)
- Dim moneyColumnBase As New ColumnBase(Of ColumnMappingBase)("Money", "decimal(9,3)", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase) With {
- .IsNullable = True
- }
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("Money", moneyColumnBase)
- Dim principalAlternateIdColumnBase As New ColumnBase(Of ColumnMappingBase)("PrincipalAlternateId", "uniqueidentifier", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase)
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("PrincipalAlternateId", principalAlternateIdColumnBase)
- Dim principalIdColumnBase As New ColumnBase(Of ColumnMappingBase)("PrincipalId", "bigint", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase)
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.Columns.Add("PrincipalId", principalIdColumnBase)
- relationalModel.DefaultTables.Add("EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+DependentBase", entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase)
- Dim entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase As New TableMappingBase(Of ColumnMappingBase)(dependentBase, entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase, True)
- entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteTableBase.AddTypeMapping(entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase, False)
- defaultTableMappings.Add(entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase)
- RelationalModel.CreateColumnMapping(DirectCast(principalAlternateIdColumnBase, ColumnBase(Of ColumnMappingBase)), dependentBase.FindProperty("PrincipalAlternateId"), entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase)
- RelationalModel.CreateColumnMapping(DirectCast(principalIdColumnBase, ColumnBase(Of ColumnMappingBase)), dependentBase.FindProperty("PrincipalId"), entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase)
- RelationalModel.CreateColumnMapping(DirectCast(enumDiscriminatorColumnBase, ColumnBase(Of ColumnMappingBase)), dependentBase.FindProperty("EnumDiscriminator"), entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase)
- RelationalModel.CreateColumnMapping(DirectCast(idColumnBase, ColumnBase(Of ColumnMappingBase)), dependentBase.FindProperty("Id"), entityFrameworkCoreVisualBasicScaffoldingInternalVisualBasicRuntimeModelCodeGeneratorTestDependentBasebyteMappingBase)
-
- Dim tableMappings As New List(Of TableMapping)()
- dependentBase.SetRuntimeAnnotation("Relational:TableMappings", tableMappings)
- Dim dependentBasebyteTable As New Table("DependentBase", Nothing, relationalModel)
- Dim principalIdColumn As New Column("PrincipalId", "bigint", dependentBasebyteTable)
- dependentBasebyteTable.Columns.Add("PrincipalId", principalIdColumn)
- Dim principalAlternateIdColumn As New Column("PrincipalAlternateId", "uniqueidentifier", dependentBasebyteTable)
- dependentBasebyteTable.Columns.Add("PrincipalAlternateId", principalAlternateIdColumn)
- Dim dataColumn As New Column("Data", "char(20)", dependentBasebyteTable) With {
- .IsNullable = True
- }
- dependentBasebyteTable.Columns.Add("Data", dataColumn)
- Dim enumDiscriminatorColumn As New Column("EnumDiscriminator", "int", dependentBasebyteTable)
- dependentBasebyteTable.Columns.Add("EnumDiscriminator", enumDiscriminatorColumn)
- Dim idColumn As New Column("Id", "tinyint", dependentBasebyteTable) With {
- .IsNullable = True
- }
- dependentBasebyteTable.Columns.Add("Id", idColumn)
- Dim moneyColumn As New Column("Money", "decimal(9,3)", dependentBasebyteTable) With {
- .IsNullable = True
- }
- dependentBasebyteTable.Columns.Add("Money", moneyColumn)
- Dim pK_DependentBasebyte As New UniqueConstraint("PK_DependentBase", dependentBasebyteTable, {principalIdColumn, principalAlternateIdColumn})
- dependentBasebyteTable.PrimaryKey = pK_DependentBasebyte
- Dim pK_DependentBasebyteUc = RelationalModel.GetKey(Me,
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+DependentBase",
- {"PrincipalId", "PrincipalAlternateId"})
- pK_DependentBasebyte.MappedKeys.Add(pK_DependentBasebyteUc)
- RelationalModel.GetOrCreateUniqueConstraints(pK_DependentBasebyteUc).Add(pK_DependentBasebyte)
- dependentBasebyteTable.UniqueConstraints.Add("PK_DependentBase", pK_DependentBasebyte)
- Dim iX_DependentBasebyte_PrincipalId As New TableIndex(
- "IX_DependentBase_PrincipalId", dependentBasebyteTable, {principalIdColumn}, True)
- Dim iX_DependentBasebyte_PrincipalIdIx = RelationalModel.GetIndex(Me,
- "EntityFrameworkCore.VisualBasic.Scaffolding.Internal.VisualBasicRuntimeModelCodeGeneratorTest+DependentBase