Public/New-Diagram.ps1

function New-Diagram {

    <#
 
    .SYNOPSIS
    Creates an ER diagram for a Dac model.
 
    .DESCRIPTION
    Uses PsDac to select the tables and foreign key constrains from a database model and creates a mermaid Entity Relationship diagrams.
 
    .EXAMPLE
 
    PS C:\> Import-DacModel WideWorldImporters.dacpac | New-SqlMermaidDiagram
 
    <svg id="mermaid-1639919827409" width="100%" xmlns="http://www.w3.org/2000/svg" ...
 
    #>


    [CmdletBinding()]
    param (

        # Specifies the database model.
        [Parameter(
            ValueFromPipeline
        )]
        # [Microsoft.SqlServer.Dac.Model.TSqlModel]
        $DacModel,

        # Specifies the separator between schema and table name.
        [Parameter()]
        $SchemaSeparator = '-'
    )

    begin {
        $relationStrings = @{
            ZeroOrOne  = '|o', 'o|'
            ExactlyOne = '||', '||'
            ZeroOrMore = '}o', 'o{'
            OneOrMore  = '}|', '|{'
        }
    }

    process {
        $lines = @('erDiagram')

        $includedTables = $()

        $DacModel | Get-DacForeignKey | ForEach-Object {
            $sourceTable, $targetTable = $_.GetReferenced() | Where-Object { $_.ObjectType.Name -eq 'Table' }

            if ( $targetTable ) {
                $sourceSchemaName, $sourceTableName = $sourceTable.Name.Parts
                $targetSchemaName, $targetTableName = $targetTable.Name.Parts
                $keySchemaName, $keyName = $_.Name.Parts


                $relationString = $relationStrings.ZeroOrMore[0] + '--' + $relationStrings.ZeroOrOne[1]
                $sourceTableString = "$sourceSchemaName$SchemaSeparator$sourceTableName"
                $targetTableString = "$targetSchemaName$SchemaSeparator$targetTableName"

                $lines += " $sourceTableString $relationString $targetTableString : $keyName"
                $includedTables += $sourceTable, $targetTable | ForEach-Object { $_.Name.ToString() }
            }
            else {
                Write-Verbose "Exclude $( $_.Name ). Foreign table was not found."
            }
        }

        $includedTables = $includedTables | Select-Object -Unique

        $DacModel | Get-DacTable | Where-Object {
            -Not ( $includedTables -contains $_.Name.ToString() )
        } | ForEach-Object {
            $schemaName, $tableName = $_.Name.Parts
            $tableString = "$schemaName$SchemaSeparator$tableName"
            $lines += " $tableString"
        }

        $lines -join "`r`n" | Write-Output
    }

}