c# asp.net core如何在控制器外部调用数据库上下文



我有一个关于在控制器外部使用数据库上下文的问题,即如何在常规类中调用数据库上下文?为了与数据库通信,我使用: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; }

and more tables…

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

例如,

services.AddTransient<YourType>();
class YourType
{
public YourType(YourDbContext context) { ... }
}

您需要使用DI(依赖注入)注入上下文。我正在向您展示一个存储库模式的示例。你可以搜索"Core c#示例"会给你很多例子或博客。查看此处和此处

看下面的例子。

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);
}
}
}

最新更新