多个上下文中的实体跟踪
本文关键字:实体 跟踪 上下文 | 更新日期: 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();
...
}
因为此时的用户属于不同的上下文。。。因此,要么我必须将我的db
与Auth
共享,要么我可能必须进行一次愚蠢的双重查找:
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
。