IEntityChangeTracker的多个实例不能引用实体

Tan*_*ang 5 c# asp.net entity-framework asp.net-mvc-4

每次我尝试将用户附加到组(或创建组)时,我都会收到此错误.

这是GroupController:

public class GroupsController : Controller
{
       private Context db = new Context();

        [HttpPost]
        public ActionResult Create(Group group)
        {
            if (ModelState.IsValid)
            {
                group.owner = db.Users.Attach((User)Session["user"]);
    //current user stored in session
                db.Groups.Add(group);
                db.SaveChanges();

                return RedirectToAction("Index", "Home");
            }
            return View(group);
        }
}
Run Code Online (Sandbox Code Playgroud)

变量Session ["user"]设置为logon,这里是AccountController代码:

public class AccountController : Controller
{
    private Context db = new Context();

    [HttpPost]
    public ActionResult LogOn(LoginTemplate login, string returnUrl)
    {

            User result = db.Users.Where(m => m.email == login.email).Where(m => m.password == login.password).SingleOrDefault();

            if (result != null)
            {
                Session["logged"] = true;
                Session["user"] = result;
                return RedirectToAction("Index", "Home");
            }
     }
 }
Run Code Online (Sandbox Code Playgroud)

这是我的背景:

public class Context : DbContext
{

    public Context() : base("name=myContext")
    {
    }
    private static Context _instance;

    public DbSet<User> Users { get; set; }
    public DbSet<Group> Groups { get; set; }

//I tried to use this method in order to always get the same context but does not work

    public static Context getContext()
    {
        if (_instance == null)
        {
            _instance = new Context();
        }

        return _instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是User.cs

       public class User
{
    [Key]
    public int userId { get; set; }

    [Display(Name="Firstname")]
    public string firstname { get; set; }

    [Display(Name = "Lastname")]
    public string lastname { get; set; }

    public virtual ICollection<Group> membership { get; set;}

}
Run Code Online (Sandbox Code Playgroud)

这是group.cs:

        public class Group
{
    [Key]
    public int idGroup { get; set; }
    public string name { get; set; } 
    public User owner { get; set; }
    public virtual ICollection<User> members { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我试图在我的Context中做一个"单例"(总是在每个控制器中重用相同的上下文)但是当我这样做时,我得到"Db关闭"错误信息......

Pau*_*lor 0

无需将 db.Users.Attach 与保存在会话状态中的 User 对象一起使用。您要保存的对象是新组,而不是用户。我的猜测是,当您调用 db.Users.Attach((User)Session["user"]) 时会引发异常,这可能表明当前用户的实体已在当前上下文中由 EF 管理。