我想扩展以下问题:
How to instantiate a DbContext in EF Core
我已经在控制器中完成了上述操作,但是现在尝试在DataAccess.cs中创建所有我要使用的数据库方法/查询。例如,到目前为止,我有以下内容:
控制器:
public class HomeController : Controller
{
DataAccess da = new DataAccess() { };
private readonly DatabaseContext db;
public HomeController(DatabaseContext reg)
{
db = reg;
}
[HttpPost, ValidateAntiForgeryToken]
public IActionResult Register(User model)
{
model.WindowsAuth = User.Identity.Name;
if (ModelState.IsValid)
{
da.Registration(model, db);
return RedirectToAction("Index");
}
在DataAccess.cs
public class DataAccess
{
public void Registration(User model, DatabaseContext db)
{
User newUser = new User();
db.Users.Add(model);
db.SaveChanges();
}
}
数据库上下文
public class DatabaseContext :DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
}
public DbSet<User> Users { get; set; }
}
以上方法有效,但是我想在DataAccess.cs中添加更多方法。我是否需要每次都从控制器传递数据库作为参数?当我尝试实例化数据访问类中的上下文类时,db变量显示为null。我是MVC的新手,所以任何进一步的阅读或与此相关的资料将不胜感激。
答案 0 :(得分:1)
在 DI 的帮助下,您应将DataAccess
注入控制器,并将DatabaseContext
注入DataAccess
。另外,不要忘记在 DI 容器中注册DataAccess
:
public class HomeController : Controller
{
private readonly DataAccess da;// = new DataAccess() { };
//private readonly DatabaseContext db;
public HomeController(DataAccess da)
{
this.da = da;
}
}
public class DataAccess
{
private readonly DatabaseContext db;
public DataAccess(DatabaseContext db)
{
this.db = db;
}
public void Registration(User model/*, DatabaseContext db*/)
{
User newUser = new User();
db.Users.Add(model);
db.SaveChanges();
}
}