【问题标题】:Entity Framework Core: Automated DB scaffolding into a class libraryEntity Framework Core:自动化的数据库脚手架到类库中
【发布时间】:2018-07-02 11:18:31
【问题描述】:

this tutorial 之后,可以通过命令行使用 Entity Framework Core 构建数据库上下文。

脚手架有一些奇怪的要求

  • 它需要一个入口点,也就是 main 方法(没有脚手架进入类库)
  • 整个项目必须是可编译的(在脚手架之前)

在我当前的项目中,我需要“共享项目”(不是直接的类库)中的模型类。共享项目没有入口点。

(由于数据库工程师在数据库优先的方法中更新了很多数据库模型,因此我目前做了很多脚手架)。

为了创建一些自动化的脚手架任务脚本,我计划自动化以下任务:

  • 创建一个新的、空的、临时的 dot net 命令行应用程序(它是可构建的并且有一个入口点)
  • 添加所需的包
  • 搭建数据库上下文和模型类
  • 将生成的类移动到库/共享项目中
  • 删除临时项目

到目前为止,我设法自动化了第一点。

但我不知道如何将 ItemGroup DotNetCliToolReference 添加到 .csproj 文件的 xml 中。

是否有任何 dotnet cli 命令可以让我添加 DotNetCliToolReference 而不仅仅是包和项目到项目的引用?

请给我任何其他提示?

【问题讨论】:

    标签: entity-framework-core scaffolding scaffold dotnet-cli


    【解决方案1】:
    1. 从 Nuget 安装 EntityFrameWorkCore.SqlserverEntityFrameWorkCore.Tools

    2. 在包管理器控制台中写入:

      Scaffold-DbContext "Data Source=.;Initial Catalog="dbName";Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Project "Project's class library Name"
      

    【讨论】:

    • 传奇!我只想补充一点,我需要从启动项目中启动它,并且必须在其中引用 Data 项目。我还必须在启动项目中拥有所有 EF 核心引用。我很着急,但我想如果你暂时将它设置为 Startup,这可以直接在 Data 项目上运行。
    【解决方案2】:

    从 EF Core 2.1 开始,该引用包含在 .NET Core SDK 中,这意味着您不必将引用添加到临时项目。

    https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-entity-framework-core-2-1/

    dotnet-ef 命令现在作为 .NET Core SDK 的一部分提供,因此不再需要在项目中使用 DotNetCliToolReference 即可使用迁移或从现有数据库构建 DbContext。

    我创建了一个快速 PowerShell 脚本,该脚本添加到类库中,然后创建一个临时项目并搭建 dbcontext 并在最后清理所有内容。

    param(
    [Parameter(Mandatory=$true)][string]$username,
    [Parameter(Mandatory=$true)][string]$password,
    [Parameter(Mandatory=$true)][string]$datasource,
    [Parameter(Mandatory=$true)][string]$catalog,
    [Parameter(Mandatory=$true)][string]$contextName
    )
    
    $workingDir = $PSScriptRoot;
    
    Write-Host "Project dir= $workingDir";
    Write-Host "Creating temp project to run scaffold on";
    cd ..
    mkdir temp
    cd temp
    dotnet new web
    Write-Host "Done creating temp project";
    Write-Host "Scaffolding dbcontext into project";
    dotnet ef dbcontext scaffold "data source=$($datasource);initial catalog=$($catalog);user id=$($username);password=$($password);MultipleActiveResultSets=True;App=EntityFramework" Microsoft.EntityFrameworkCore.SqlServer --output-dir Entities --context $contextName --project temp.csproj
    Write-Host "Done scaffolding dbcontext into temp project";
    New-Item -ErrorAction Ignore -ItemType directory -Path "$workingDir/Entities";
    Move-Item ./Entities/* "$workingDir/Entities" -force;
    Write-Host "Scaffold completed! Starting clean-up";
    cd ..
    Remove-Item ./temp -force -Recurse;
    cd $workingDir;
    Write-Host "Clean-up completed!";
    

    我确信脚本可以改进,但效果很好。

    脚本的工作原理如下:

    假设我们在 classlib 目录中运行脚本:c:/test/classlib

    1. 存储当前目录
    2. 创建一个临时 Web 项目:c:/test/temp
    3. 为 DBContext 搭建支架
    4. 将脚手架项移动到类库中(请注意脚本设置为覆盖当前实体目录)
    5. 删除临时项目

    您仍然需要将命名空间更改为正确的命名空间。据我所知,支持脚手架上的命名空间目前在 2.2 的列表中。希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      您是否尝试过我的“EF Core Power Tools”——它们或许可以帮助您自动化该过程?

      【讨论】:

        【解决方案4】:

        dotnet add reference lib1/lib1.csproj

        dotnet add package Newtonsoft.Json

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-10
          • 2021-05-10
          • 2021-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多