C# Asp net core 如何在控制器之外调用数据库上下文

Posted

技术标签:

【中文标题】C# Asp net core 如何在控制器之外调用数据库上下文【英文标题】:C# Asp net core How to call database context outside of controllers 【发布时间】:2021-10-29 07:47:25 【问题描述】:

我有一个关于在控制器外使用数据库上下文的问题,即如何在常规类中调用数据库上下文? 为了与数据库通信,我使用:EF Core

我使用了这样的选项:

private readonly MSSQLContext _context;

    public BookingController(MSSQLContext context)
    
        _context = context;
    

另类

            using (MSSQLContext context=new MSSQLContext())
        
            context.get_Users.ToList();
        

Startup.cs

      services.AddDbContext<MSSQLContext>(options =>
            options.UseSqlServer(connection));

MSSQLContext.cs

        public MSSQLContext()
    
    

    public MSSQLContext(DbContextOptions<MSSQLContext> options)
        : base(options)
    

    
    public DbSet<VIVT_Core_Aud.Models.Core.Logger_Model> Logger_Models  get; set; 

还有更多表格...

【问题讨论】:

【参考方案1】:

将上下文注入到您需要调用的任何类中,并将该类注册到启动类中的 DI 框架中。

例如,

services.AddTransient<YourType>();

class YourType

    public YourType(YourDbContext context)  ... 

【讨论】:

“错误 CS7036 缺少与来自“Bitrix24_API.Bitrix24_API (MSSQLContext)”的所需形式参数“context”相对应的参数“以及如何克服这个问题?也许我在问愚蠢的问题:( @Shadow_VRN36 你是如何实例化你的类的?通过 DI 还是使用 new 关键字? 您需要使用适当的构造函数将您的 dBcontext 放入存储库。 我已使用 EF Core 将存储库模式示例添加到 MVC 项目中。希望对您有所帮助。【参考方案2】:

您需要使用 DI(依赖注入)来注入上下文。我正在向您展示存储库模式的示例。您可以搜索“存储库模式 EF Core C# 示例”将为您提供大量示例或博客供您参考。 Check here 和 here

看看下面的例子..

MyRepository.cs

namespace MyApp.Data.Services

    public class MyRepository: IMyRepository, IDisposable
    
        private MyAppContext _context;
        private readonly ILogger<MyRepository> _logger;

        public MyRepository(MyAppContext context, ILogger<MyRepository> logger)
        
            _context = context ?? throw new ArgumentNullException(nameof(context));
            _logger = logger;
        

        public IEnumerable<MyTable> GetMyTableData()
        
          return _context.MyTable.ToList();
         


IMyRepository.cs

namespace MyApp.Data.Services

    public interface IMyRepository
        
           //Interface implementation
            IEnumerable<MyTable> GetMyTableData();
         

MVC项目的Startup.cs

services.AddDbContext<MyAppContext>(options =>
                        options.UseSqlServer(Configuration.GetConnectionString("AppDbConnString")));            

//Scope of repository should be based on your project used, I recommend to check lifetime & scope based your project needs.     
services.AddScoped<IMyRepository, MyRepository>();
           

Mycontroller.cs

using MyApp.Data.Services;

namespace MyApp.Controllers

    
    public class HomeController : Controller
    
        private readonly ILogger<HomeController> _logger;
        private readonly IMyRepository _myRepository;

public HomeController(ILogger<HomeController> logger, IMyRepository myRepository)
        
            _logger = logger;
            _myRepository = myRepository ??
            throw new ArgumentNullException(nameof(myRepository));                
            
        

        public IActionResult Index()
        
            return View();
        
public IActionResult GetAllData()
        
            var result =  _myRepository.GetMyTableData();
            return Json(result);

        


【讨论】:

以上是关于C# Asp net core 如何在控制器之外调用数据库上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

Asp.net Core WebAPI 基于资源的控制器级别之外的授权

如何对 ASP.NET Core 控制器或模型对象进行单元测试?

ASP.NET MVC / C#:如何显示属于另一个控制器的部分视图数据

如何使用 ASP.NET Core 同时制作 Razor Page 和 C# 代码框架?