Commands/Start-EFPoshModel.ps1

Function Start-EFPoshModel {
    Param(
        [Parameter(Mandatory = $true, ParameterSetName = "MSSQL")]
        [string]$MSSQLServer,
        [Parameter(Mandatory = $true, ParameterSetName = "MSSQL")]
        [string]$MSSQLDatabase,
        [Parameter(Mandatory = $false, ParameterSetName = "MSSQL")]
        [bool]$MSSQLIntegratedSecurity = $true,
        [Parameter(Mandatory = $true, ParameterSetName = "MSSQL")]
        [string]$FilePath,
        [Parameter(Mandatory = $false, ParameterSetName = "MSSQL")]
        [switch]$Overwrite,
        [Parameter(Mandatory = $false, ParameterSetName = "MSSQL")]
        [string[]]$EntitesToMap,
        [Parameter(Mandatory = $false, ParameterSetName = "MSSQL")]
        [switch]$AllEntities
    )
    Write-Verbose 'Creating new Model object'
    $ParentDirectory = ( Get-Item $PSScriptRoot ).Parent.FullName
    if($Overwrite){
        If(Test-Path $FilePath) { Remove-Item $FilePath -Force -ErrorAction Stop }
        If(Test-Path $FilePath) {
            throw "Could not remove existing file $FilePath with Remove-Item - Please remove it manually first"
            return
        }
    }
    If(-not (Test-Path $FilePath)) {
        $null = Copy-Item "$ParentDirectory\DBContexts\MSSqlTemplate.ps1" -Destination $FilePath -Force
        $Content = Get-Content $FilePath -Raw
        $Content = $Content.Replace('##Server##', $MSSQLServer).Replace('##Database##', $MSSQLDatabase).Replace("'##IntegratedSecurity##'", "`$$MSSQLIntegratedSecurity")
        $Content | Out-File $FilePath -Force -Encoding utf8
    }
    $Context = & "$ParentDirectory\DBContexts\MSSqlInformationSchemasDbContext.ps1" -Server $MSSQLServer -Database $MSSQLDatabase -IntegratedSecurity $MSSQLIntegratedSecurity
    $TableList = @{}
    $ViewList = @{}
    $SchemaList = New-Object System.Collections.Generic.List[string]
    
    $AllTableInformation = $Context.MSSQLInformationSchemaTables.ToList()
    
    $UniqueSchemas = $AllTableInformation.TABLE_SCHEMA | Select-Object -Unique
    foreach($schema in $UniqueSchemas) { $SchemaList.Add($schema) }
    foreach($schema in $UniqueSchemas) {
        $TableList[$schema] = New-Object System.Collections.Generic.List[string]
        $ViewList[$schema] = New-Object System.Collections.Generic.List[string]
        foreach($table in $AllTableInformation) {
            if($table.TABLE_SCHEMA -eq $schema -and $table.TABLE_TYPE -ne 'View'){
                $TableList[$schema].Add($table.TABLE_NAME)
            }
            elseif($table.TABLE_SCHEMA -eq $schema) {
                $ViewList[$schema].Add($table.TABLE_NAME)
            }
        }
    }
    
    $Script:ContextFileSettings = @{
        'Context' = $Context
        'FilePath' = $FilePath
        'EntitiesToMap' = @($EntitesToMap)
        'Schemas' = $SchemaList
        'Tables' = $TableList
        'Views' = $ViewList
    }
    if($AllEntities) {
        $EntitesToMap = $AllTableInformation.TABLE_NAME
    }
    if($EntitesToMap.Count -gt 0){
        Foreach($entity in $EntitesToMap){
            Foreach($tableInfo in $AllTableInformation){
                if($tableInfo.Table_Name -eq $entity){
                    $null = Add-EFPoshModelEntity -DBSchema $tableInfo.TABLE_SCHEMA -Name $tableInfo.Table_Name
                }
            }
        }
    }
}