多个上下文中的实体跟踪

时间:2011-09-14 19:20:11

标签: c# entity-framework asp.net-mvc-3

在具有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,因为它无法访问控制器 - 所有这一切都很好,直到controller想要对返回的对象进行更改:

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

因为此时的用户属于不同的上下文...所以要么我必须与db分享我的Auth,要么我不得不做一个愚蠢的双重查找:< / p>

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

推荐的解决方法是什么?

1 个答案:

答案 0 :(得分:1)

为什么不通过构造函数注入将模型/ EF上下文传入Auth类?这似乎是最合理的方式(一旦你设置了IOC容器,实际上同样适用于你的控制器。)

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

理想情况下,您还可以根据抽象界面进行此项工作,以便您可以独立于EF测试Auth