Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Razor.cs页面之外为实体框架核心进行依赖注入_C#_Asp.net Core_Dependency Injection_Asp.net Core 2.1 - Fatal编程技术网

C# 在Razor.cs页面之外为实体框架核心进行依赖注入

C# 在Razor.cs页面之外为实体框架核心进行依赖注入,c#,asp.net-core,dependency-injection,asp.net-core-2.1,C#,Asp.net Core,Dependency Injection,Asp.net Core 2.1,这是针对ASP.NETCore2.1的,它使用Razor和实体框架核心 我认为问题在于如何在ConfigureServices方法中定义ReadData 我们已经试着研究这个问题,但仍然无法让代码正常工作 试图通过除Razor页面之外的另一个类使用Entity Framework Core设置数据库访问 在ConfigureServices方法中的Startup类中,我们有以下内容(我认为这将在Razor pages.cs中为构造函数设置依赖注入): 下面是ReadData类: public c

这是针对ASP.NETCore2.1的,它使用Razor和实体框架核心

我认为问题在于如何在
ConfigureServices
方法中定义
ReadData

我们已经试着研究这个问题,但仍然无法让代码正常工作

试图通过除Razor页面之外的另一个类使用Entity Framework Core设置数据库访问

ConfigureServices
方法中的
Startup
类中,我们有以下内容(我认为这将在Razor pages.cs中为构造函数设置依赖注入):

下面是
ReadData
类:

public class ReadData : IReadData
{
    private readonly MyProject.Data.AppDbContext _context;

    public ReadData(MyProject.Data.AppDbContext context)
    {
        this._context = context;
    }

    public async Task<IList<Car>> FetchCars(string carOwner)
    {
        var cars =  _context.Cars.Where(p => p.Owner == carOwner);
        return await Task.FromResult(cars.ToList());
    }
}
它抱怨没有为
ReadData
类的所需参数分配参数

但是,在
ReadData
中,如果我们像这样添加链接构造函数:

public ReadData() : this(new MyProject.Data.AppDbContext()) { }
我们得到一个错误:

InvalidOperationException:尚未为此DbContext配置任何数据库提供程序。可以通过重写DbContext.OnConfigurang方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,那么还要确保DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数


我们如何让依赖项注入在
ReadData
类中为实体框架核心工作?

只需在
MyPageModel
的构造函数上注入
IReadData

public class MyPageModel : PageModel
{
    private readonly MyProject.Data.AppDbContext _context;
    private readonly IReadData _readData ;

    public MyPageModel(IReadData readData)
    {
        _readData = readData;
    }

    public async Task OnGetAsync()
    {
        var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
       var Prayer = await _readData.FetchCars(userName);
    }
}
不创建ReadData的实例

ReadData ReadData=新的ReadData()


让DI容器在注册
services.AddScoped()时解析依赖项

只需在
MyPageModel

public class MyPageModel : PageModel
{
    private readonly MyProject.Data.AppDbContext _context;
    private readonly IReadData _readData ;

    public MyPageModel(IReadData readData)
    {
        _readData = readData;
    }

    public async Task OnGetAsync()
    {
        var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
       var Prayer = await _readData.FetchCars(userName);
    }
}
不创建ReadData的实例

ReadData ReadData=新的ReadData()


让DI容器在注册
services.AddScoped()时解析依赖项

您的
ReadData
类应在其构造函数中采用上下文:

public ReadData(MyProject.Data.AppDbContext context)
{

}
现在,您只需将该类注入到您的模型中:

public class MyPageModel : PageModel
{
    private readonly IReadData _readData ;

    public MyPageModel(IReadData readData)
    {
        _readData = readData;
    }

    public async Task OnGetAsync()
    {
        var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
       var Prayer = await _readData.FetchCars(userName);
    }
}

让DI容器为您创建对象。

您的
ReadData
类应该在其构造函数中包含一个上下文:

public ReadData(MyProject.Data.AppDbContext context)
{

}
现在,您只需将该类注入到您的模型中:

public class MyPageModel : PageModel
{
    private readonly IReadData _readData ;

    public MyPageModel(IReadData readData)
    {
        _readData = readData;
    }

    public async Task OnGetAsync()
    {
        var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
       var Prayer = await _readData.FetchCars(userName);
    }
}
让DI容器为您创建对象