在项目

时间:2017-10-03 15:10:40

标签: c# entity-framework nuget

在包管理器控制台中输入的实体框架命令,如Add-MigrationUpdate-Database,在处理具有非标准"的解决方案时会变得相当长且复杂。建立。

使用语法和选项,如:

Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] 
  [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-IgnoreChanges] 
  [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] 
  [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> 
  [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] 
  [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] 
  [-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] 
  [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] 
  -ConnectionString <String> -ConnectionProviderName <String> 
  [-AppDomainBaseDirectory <String>] [<CommonParameters>]

在项目中管理这些命令有什么好的选择吗?我经常发现自己创建一个带有注释和保存命令行的.txt文件,并将其保存在&#34; doc&#34;解决方案级别的文件夹。我根据需要从这里复制并粘贴命令,但似乎应该有更好的方法来处理这些命令。

理想情况下,我希望能够创建一个&#34;批处理文件&#34; (或类似的东西),包管理器控制台可以采用简化选项并将其扩展为完整命令。例如,我运行Add-Migration-Ex MyNewMigration,它会扩展为完整的Add-Migration命令,并应用当前项目的所有其他标准选项和开关。

有没有更简单的方法来管理这些类型的复杂命令,这使得它们更容易保存并在每个项目/解决方案级别上运行?

1 个答案:

答案 0 :(得分:1)

经过大量研究后,我发现NuGet有一个系统可以在解决方案负载下运行power-shell脚本。 Nuget将寻找名为&#34; init.ps1&#34;的脚本。在包装工具&#34;目录,并在解决方案加载时执行它。我将利用这一点,并创建一个在解决方案加载时运行的NuGet包,它将检查名为&#34; SolutionCommands&#34;的解决方案中的目录。然后它将运行任何脚本,并安装位于该目录中的任何模块。这些脚本可以作为Visual Studio中解决方案的一部分进行管理,通过版本控制遵循解决方案,并自动分发给团队中的所有开发人员。

我已经在Nuget上创建了初步package,现在可供其他任何想要此功能的人使用。它还没有真正经过测试,脚本需要在它们运行之前签名(或者计算机的安全策略放松)。

init.ps1:

$oldLocation = Get-Location

$oldWarningPref = $WarningPreference
$WarningPreference = 'SilentlyContinue'

$commandDirectory = ".\SolutionCommands"

If(Test-Path $commandDirectory)
{
    Write-Host "Installing Modules..."
    Get-ChildItem $commandDirectory -Filter "*.psm1" |
    ForEach-Object {
        $fullPath = Join-Path -Path $commandDirectory -ChildPath $_.Name
        $fileName = Split-Path -Path $fullPath -Leaf
        $fileNameNoExtension = [System.IO.Path]::GetFileNameWithoutExtension($fullPath)

        if (Get-Module | ?{ $_.Name -eq $fileNameNoExtension })
        {
            Remove-Module $fileNameNoExtension
        }
        Import-Module ($fullPath)

        Write-Host "Loaded module: " $fullPath
        Write-Host "      Commands: " (Get-Command -Module $fileNameNoExtension)
        Write-Host
    }

    Write-Host "Executing Scripts..."
    Get-ChildItem $commandDirectory -Filter "*.ps1" |
    ForEach-Object {
        $fullPath = Join-Path -Path $commandDirectory -ChildPath $_.Name
        Write-Host $fullPath
        . $fullPath
    }
}

Set-Location $oldLocation
$WarningPref = $oldWarningPref