c# - MVC EF 数据库存储库模式

标签 c# asp.net-mvc entity-framework repository-pattern

我已经阅读了关于这个主题的各种帖子,但找不到我的问题的答案。

普遍的共识是我应该为 1 个工作单元(比如 1 个网页)创建上下文。我在我的 Database.cs(见下文)中包含了每个方法,因此对我来说是“使用”——这意味着每次调用此类中的方法时——都会创建一个上下文。因此,如果我要从 HomeController.cs 中的同一操作调用 Database.cs 中的 2 个方法 - 这是否意味着创建了 2 个上下文?

像这样在 Database.cs 中声明一个私有(private)字段不是更好吗:

private Entities db = new Entities()

让 Database.cs 类中的每个方法访问它?哪种方法最好?

我当前的实现(我只打算包含验证方法,但数据库类中有很多方法):

HomeController.cs

    [AllowAnonymous]
    public class HomeController : Controller
    {
        private IDatabase Database;

        public HomeController()
        {
            this.Database = new Database();
        }

        [HttpGet]
        public ActionResult Verify(string id)
        {
            if (Database.VerifyUser(id))
            {
                return View();
            }
            else
            {
                ViewBag.Error = "There was an error with the verification process";
                return View();
            }
        }
    }

数据库.cs

public class Database : IDatabase
{
... some other methods ...
    public bool VerifyUser(string verificationHash)
    {
        using (Entities db = new Entities())
        {
            var userToVerify = db.VerifyUser(verificationHash);
            int count = userToVerify.Count();
            if (count == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

db.VerifyUser(..) - 这是对存储过程的调用

最佳答案

是的,这意味着有两个 DbContext 实例。 更好的做法是在您的数据库类中拥有一个 DbContext 实例,并在您的所有方法中使用该实例。

public class Database : IDatabase, IDisposeable
{
    private Entities db;
    public Database()
    {
        db = new Entities()
    }

... some other methods ...
    public bool VerifyUser(string verificationHash)
    {
        var userToVerify = db.VerifyUser(verificationHash);
        int count = userToVerify.Count();
        if (count == 1)
        {
            return true;
        }
        else
        {
            return false;
        }        
    }

    public void Dispose()
    {
        db.Dispose()
    }
}

然后,当您从数据库实例完成后,您将处置它,它将处置 DbContext

public class HomeController : Controller
{
    private IDatabase Database;

    public HomeController()
    {
        this.Database = new Database();
    }

    [HttpGet]
    public ActionResult Verify(string id)
    {
        using(this.Database)
        {
            if (Database.VerifyUser(id))
            {
                return View();
            }
            else
            {
                ViewBag.Error = "There was an error with the verification process";
                return View();
            }
        }
    }   
}

顺便说一句:您可能更愿意在 Controller 级别处理您的资源。在这种情况下,您不需要在操作中添加 using 语句 例如将此添加到您的 Controller :

protected override void Dispose(bool disposing)
{
    this.Database.Dispose();
    base.Dispose(disposing);
}

关于c# - MVC EF 数据库存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575198/

相关文章:

c# - 从 XmlReader 的字符串中删除\"转义字符

entity-framework - 使用 Entity Framework 记录每个数据更改

c# - 搭建controller vs2015时报错Key Already Exists in Table

asp.net-mvc - 如何优雅地处理 maxRequestLength 异常?

c# - 将 Select Option 的选定值作为 href 中的参数传递

c# - 按索引从 IQueryable<anonymous> 列表中获取元素

c# - 使用 .Net HttpListener 的多线程

c# - 将 'Type' 传递给通用构造函数

c# - .Net Maui - 如何返回根页面

asp.net-mvc - 使用 FormCollection 时,MVC 3 RTM allowedHtml 不起作用