ASP. NET Ядро: как использовать существующие SQL Серверные базы данных в Visual Studio Code & CLI? - PullRequest
0 голосов
/ 16 января 2020

Я новичок в asp. net ядре и следовал этому руководству для создания нового mvc веб-приложения, но оно использует новую базу данных SQLite.

I Обнаружено, что многие учебники используют SQL Сервер с Visual Studio. Как я могу использовать существующую базу данных для создания лесов в Visual Studio Code? или Как я могу сделать то же самое, что и учебник?

Теперь у меня есть совершенно новое mvc веб-приложение и база данных, подобная этой:

enter image description here

Спасибо за вашу помощь!

Еще один вопрос, пожалуйста:

Согласно этой странице .

Там сказано The Movie class contains an Id field, which is required by the database for the primary key.

Однако у меня нет целочисленного поля ID в моей базе данных, что приводит к ошибке primary key not found, когда я пытаюсь использовать aspnet-codegenerator для эшафот контроллер. Есть ли решение? Спасибо!

1 Ответ

2 голосов
/ 16 января 2020

Как использовать существующую базу данных для создания лесов в Visual Studio Code

Если вы хотите повторно использовать существующую базу данных, вы можете сделать это, как показано ниже:

  1. Убедитесь, что вы добавили эти необходимые инструменты / пакеты.

    • инструмент dotnet-ef: dotnet tool install --global dotnet-ef
    • другие связанные пакеты:
      • Microsoft.EntityFrameworkCore.Design
      • Microsoft.EntityFrameworkCore.SqlServer
      • Microsoft.VisualStudio.Web.CodeGeneration.Design

    Если вы используете 3.1, вы можете установить этот пакет по ссылке.

    нажмите клавишу Ctrl + ` в пределах VSCode, чтобы открыть терминал:

    > cd <the-folder-of-your-proj>
    > dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.*
    > dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.*
    > dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.*
    
  2. и используйте команду dotnet ef dbcontext scaffold для эшафот существующая база данных:

    dotnet ef dbcontext scaffold -c MyDbContext "your-connection-string" Microsoft.EntityFrameworkCore.SqlServer -o Models
    

    , а затем файл MyDbContext и некоторые файлы сущностей создаются в папке Models/.

  3. Перемещение ConnectionStrings из исходного кода в файлы конфигурации.

    3.1 Очистите метод OnConfiguring () в MyDbContext:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        <strike>if (!optionsBuilder.IsConfigured)
        {
        #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
            optionsBuilder.UseSqlServer("your-connection-string");
        }</strike>
    }
    

    3.2 Добавьте строку подключения к appsettings.Development.json. Например:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      <b>"ConnectionStrings": {
        "MyDbContext": "Server=(localdb)\\mssqllocaldb;Database=MyApp;Trusted_Connection=True;MultipleActiveResultSets=true"
      }</b>
    }
    

    (обратите внимание, здесь мы используем double sla sh (\\), чтобы показать, что \ экранирован. Это отличается от команды powershell с 1-м шагом.)

  4. Наконец, добавьте сервис DbContext в свой Startup :: ConfigureServices ():

    services.AddDbContext<MyDbContext>(opts=>{
        opts.UseSqlServer(Configuration.GetConnectionString("MyDbContext"));
    });
    

или Как я могу сделать то же самое, что и учебник?

Если вы пытаетесь создать новый проект в VSCode, вызовите dotnet new mvc для создания приложения. Не забудьте добавить инструменты / пакеты, о которых мы говорили выше. А затем вызовите dotnet aspnet-codegenerator для генерации контроллера / просмотров / страниц, как показано ниже:

dotnet aspnet-codegenerator controller -m $model -dc $dcClass -name $controllerName -namespace $controllerNamespace -outDir Controllers --useDefaultLayout

Здесь

  • $model - это название вашей модели
  • $dcClass - это имя вашего класса DbContext
  • $controllerName - это имя вашего контроллера
  • $controllerNamespace - это пространство имен

Эта команда также добавит новый DbContext, если $dcClass не существует. Не стесняйтесь обновлять строки подключения в application.json. (В этом случае не забудьте вызвать dotnet ef migrations add initial && dotnet ef database update для синхронизации c БД перед запуском приложения MVC)

Эта команда утомительна. Поэтому я написал команду powershell, чтобы упростить мою работу:

param (
    [Switch]$api = $false ,
    [string]$model = $(Read-Host "Model Name(without namespace)")
)

if( [string]::IsNullOrEmpty($model) ) {
    Write-Host "you need specify the model name (without a namespace)"
    exit
}

function Prompt-Parameter{
    param (
        [Parameter(Mandatory=$true)] [string] $message,
        $defaultValue
    )

    $result = Read-Host "Press enter $message (default value ['$defaultValue'])" 
    if([String]::IsNullOrEmpty($result) )
    {
        $result = $defaultValue
    }

    return $result
}

Write-Host "[+]set class name:"
$controllerName= $(Prompt-Parameter "Controller Name(without namespace)" -defaultValue "$($model)Controller")
$dcName= $(Prompt-Parameter "DbContext Name (without namespace)" -defaultValue "AppDbContext")

Write-Host "[+]set namespace:"
$rootNamespace = $( Prompt-Parameter -message "ROOT namespace" -defaultValue "App")
$controllerNamespace= $(Prompt-Parameter "namespace of Controller" -defaultValue "$rootNamespace.Controllers")
$modelNamespace = $(Prompt-Parameter "namespace of Model" -defaultValue "$rootNamespace.Models")
$dcNamespace= $(Prompt-Parameter "namespace of DbContext" -defaultValue "$rootNamespace.Data")

$modelClass = "$modelNamespace.$model"
$controllerClass = "$controllerNamespace.$controllerName"
$dcClass = "$dcNamespace.$dcName"

Write-Host $rootNameSpace
Write-Host $modelClass
Write-Host $controllerClass
Write-Host $dcClass

# whether to generate a controller with views or an ApiController
$apiSwitch = if($api) {"-api"} else {""}

dotnet aspnet-codegenerator controller $apiSwitch -m $model -dc $dcClass -name $controllerName -namespace $controllerNamespace -outDir Controllers --useDefaultLayout

С помощью этого dotnet-controller-generate.ps1 я могу сгенерировать контроллеры / представления для модели с помощью:

dotnet-controller-generate.ps1 TheModelName

Создать WebAPI для модель по:

dotnet-controller-generate.ps1 -api TheModelName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...