多个上下文中的实体跟踪

本文关键字:实体 跟踪 上下文 | 更新日期: 2023-09-27 18:08:31

在具有EF模型的典型MVC3应用程序中,每个控制器实例化自己的模型容器副本。这意味着,如果我要在不同的文件中创建一个类,并且它需要访问模型,那么它将需要实例化自己的容器。

考虑以下内容:

namespace X.Web.Controllers
{
    public class TestController : Controller
    {
        EFContainer db = new EFContainer();
        public ActionResult Whatever()
        {
            User u = db.Users.Find(3);
            ...
        }

如果我想抽象类Auth中用户的获取,那么它必须实例化自己的db,因为它不能访问控制器的——在控制器想要对返回的对象进行更改之前,一切都很好:

    public ActionResult Whatever()
    {
        User u = Auth.GetUser();
        u.Name = "ekkis";
        db.SaveChanges();
        ...
    }

因为此时的用户属于不同的上下文。。。因此,要么我必须将我的dbAuth共享,要么我可能必须进行一次愚蠢的双重查找:

    public ActionResult Whatever()
    {
        int id = Auth.GetUserId();
        User u = db.Users.Find(id);
        u.Name = "ekkis";
        db.SaveChanges();
        ...
    }

处理这个问题的建议方法是什么?

多个上下文中的实体跟踪

为什么不通过构造函数注入Auth类来传入模型/EF上下文?这似乎是最合理的方式(一旦你设置了国际奥委会集装箱,这同样适用于你的控制器(。

public class Auth
{
    public Auth(EFContainer db) 
    {
        //...
    }
}

理想情况下,您还可以基于抽象接口进行此操作,这样您就可以独立于EF测试Auth