【问题标题】:Creating a database class in MVC在 MVC 中创建数据库类
【发布时间】:2019-07-13 18:03:20
【问题描述】:

我想扩展以下问题:

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 的新手,因此任何与此相关的进一步阅读或资源将不胜感激。

【问题讨论】:

  • 能否请您出示您的DataAccess 班级?
  • 它就在那里。不过我现在已经添加了上下文类。

标签: c# asp.net-core model-view-controller


【解决方案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();
    }
}

【讨论】:

  • 谢谢。这行得通,必须弄清楚如何在我的 DI 容器中注册 DataAccess,但最终得到了它。
  • services.AddScoped();在 startup.cs 中 ConfigureServices() - 供将来遇到类似问题的任何人使用
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 2014-11-05
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多