Невозможно ввести контроллер, DbContext на страницу бритвы Blazor (на стороне сервера Blazor) - PullRequest
0 голосов
/ 02 августа 2020

Я использую последнюю версию. NET Стек основных технологий включает: Microsoft Visual Studio Community 2019 Preview Version 16.7.0 Preview 6.0; . NET Core 5.0.100-превью.7.20366.6; Microsoft.EntityFrameworkCore.SqlServer версии 5.0.0-preview.7.20365.15; Microsoft SQLServer 2019 для моего серверного веб-приложения Blazor.

В Startup.cs У меня есть

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddSingleton<SysAutoIdController>();

В файле SystemInformation.razor

@page "/system_information"
@using myproj.Forms
@using myproj.DTO
@using myproj.Models

@inject myproj.Data.ApplicationDbContext dbContext;
@inject myproj.Controllers.SysAutoIdController sysAutoIdController;


<h3>System information</h3>

database size = @foo

@code {
   string fooTemp = sysAutoIdController.getDbSize(dbContext);
   string foo = foo2.ToString();
}

Контроллер, файл SysAutoIdController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using myproj.Data;
using myproj.Models;
using Microsoft.EntityFrameworkCore;

namespace myproj.Controllers
{
    public class SysAutoIdController : Controller
    {
        ApplicationDbContext db = new ApplicationDbContext();

        public string getDbSize(ApplicationDbContext db2)
        {
            var foo = db2.SysautoId.FromSqlRaw("" +
        " SELECT a.dbdisk " +
        " FROM " +
            "(SELECT sys.databases.name AS dbname, " +
              "      CONVERT(VARCHAR, SUM(SIZE) * 8 / 1024) + \' MB\' AS dbdisk " +
            " FROM sys.databases " +
           " JOIN sys.master_files ON sys.databases.database_id = sys.master_files.database_id " +
           " GROUP BY sys.databases.name) a " +
        " WHERE a.dbname = \'mydatabase\' ");
            return foo.ToString();
        }
    }
}

Ошибка

введите описание изображения здесь

CS0236: инициализатор поля не может ссылаться на нестатическое c поле, метод или свойство SystemInformation.sysAutoIdController

CS0236: инициализатор поля не может ссылаться нестатическое c поле, метод или свойство 'SystemInformation.dbContext'

Как запустить что-то вроде sysAutoIdController.getDbSize(dbContext); при успешной странице бритвы?

Ответы [ 2 ]

1 голос
/ 02 августа 2020

«Инициализатор поля» запускается непосредственно перед конструктором вашего объекта. В случае страницы Blazor, которая находится непосредственно перед любыми инъекциями. Синтаксис C# не позволит вам использовать что-либо из еще не созданного экземпляра.

@code {
   string fooTemp; // = sysAutoIdController.getDbSize(dbContext);
   string foo => foo2?.ToString();  // string.ToString() is a little pointless

    protected override async Task OnInitializedAsync()
    {
       // see if you can make getDbSize async, that would be better
       fooTemp = sysAutoIdController.getDbSize(dbContext);
    }
}

Боковое примечание: DbContext - ценный ресурс, которым вам нужно управлять. Пусть вводится в Контроллер, у вас уже все прописано:

public class SysAutoIdController : Controller
{
   public SysAutoIdController(ApplicationDbContext db)
   {
      _db = db;
   }

   ... 
}

    
0 голосов
/ 02 августа 2020

Спасибо за ответ Хенк Холтерман at { ссылка }

(1) Контроллер

using myproj.Data;

public class SysAutoIdController : Controller
{

   ApplicationDbContext _db;
    
   public SysAutoIdController(ApplicationDbContext db)
   {
      _db = db;
   }

   public string getDbSize()
        {
            var foo = _db.SysautoId.FromSqlRaw("" +
        " SELECT a.dbdisk " +
        " FROM " +
            "(SELECT sys.databases.name AS dbname, " +
              "      CONVERT(VARCHAR, SUM(SIZE) * 8 / 1024) + \' MB\' AS dbdisk " +
            " FROM sys.databases " +
           " JOIN sys.master_files ON sys.databases.database_id = sys.master_files.database_id " +
           " GROUP BY sys.databases.name) a " +
        " WHERE a.dbname = \'mydatabase\' ");
            return foo.ToString();
    }

}

(Действительно, raw SQL не работает, пробовал простым запросом, исправлю позже.)

(2) Я не вставляю контроллер в Startup.cs

//services.AddSingleton<SysAutoIdController>(); // Important: must comment.

(3) В файле razor

@page "/system_information"
@using myproj.Forms
@using myproj.DTO
@using myproj.Models


@inject myproj.Data.ApplicationDbContext dbContext;
@*@inject myproj.Controllers.CommonController commonController;*@  @*must comment*@


Database size: @fooTemp

@code {
    string fooTemp;

    protected override async Task OnInitializedAsync()
    {
        myproj.Controllers.CommonController Cc = new Controllers.CommonController(dbContext);
        // see if you can make getDbSize async, that would be better
        fooTemp = Cc.getDbSize();
    }

}

Тогда работает!

На самом деле, я не очень понимаю проблему , почему это работает, кто-нибудь может оставить комментарий или ответить для меня подробнее.

...