一个实体对象不能由多个 IEntityChangeTracker 实例引用

时间:2022-01-27 07:12:20

初学Entity Framework,添加数据时,提示"一个实体对象不能由多个 IEntityChangeTracker 实例引用"这个问题,添加不成功.调试很久,发现问题所在.先说下环境.

.net framework版本:

4.0

Microsoft Visual Studio版本:

2010

Microsoft Sql Server版本:

2008

使用表关系图:

一个实体对象不能由多个 IEntityChangeTracker 实例引用

两个表数据如下:

一个实体对象不能由多个 IEntityChangeTracker 实例引用 

前提:

之前建立edmx文件时,未选中"在模型中加入外键列"复选框.现在模拟这种情况。

一个实体对象不能由多个 IEntityChangeTracker 实例引用

建立Edmx:

一个实体对象不能由多个 IEntityChangeTracker 实例引用

DAL:

    /*
     * 简写代码
     * */
    /// <summary>
    /// 单位DAL
    /// </summary>
    public class DeptDAL
    {
        NPOIDataTestEntities entity = new NPOIDataTestEntities();

        /// <summary>
        /// 根据deptid获取单条部门信息
        /// </summary>
        /// <param name="deptID"></param>
        /// <returns></returns>
        public np_dept GetSingle(int deptID)
        {
            return entity.np_dept.FirstOrDefault(x => x.deptID == deptID);
        }
    }

    public class UserDAL
    {
        NPOIDataTestEntities entity = new NPOIDataTestEntities();

        /// <summary>
        /// 插入单个用户
        /// </summary>
        /// <param name="user"></param>
        public void AddUser(np_user user)
        {
            entity.AddTonp_user(user);
            entity.SaveChanges();
        }
    }

BLL:

 

    /*
     * 简写代码 
     * 暂仅起到转移作用
     * */
    public class DeptBLL
    {
        DeptDAL dal = new DeptDAL();

        /// <summary>
        /// 根据deptid获取单条部门信息
        /// </summary>
        /// <param name="deptID"></param>
        /// <returns></returns>
        public np_dept GetSingle(int deptID)
        {
            return dal.GetSingle(deptID);
        }
    }

    public class UserBLL
    {
        UserDAL dal = new UserDAL();

        /// <summary>
        /// 插入单个用户
        /// </summary>
        /// <param name="user"></param>
        public void AddUser(np_user user)
        {
            dal.AddUser(user);
        }
    }

页面调用:

    /// <summary>
    /// 虚拟一个User,Page页上无任何数据
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        UserBLL userdal = new UserBLL();

        //userID自动增长
        userdal.AddUser(new np_user()
            {
                userName = "wwww",
                np_dept = new DeptBLL().GetSingle(1)
            });
    }

提示错误:

一个实体对象不能由多个 IEntityChangeTracker 实例引用

原因:

UserDAL和DeptDAL中分别声明了entity变量.对于同一个user对象来说,引用该对象的entity变量和该对象的np_dept所对应的entity引用应该来自同一个entity变量.但现在,userdal中的entity对象引用的user对象,而deptdal中的entity对象引用的是user.dept对象.两者不是同一个entity对象.

解决办法:

方法一、在未修改edmx文件的情况下:

在UserDAL中,声明一个方法,该方法通过同一个entity返回一个dept对象即可.仅修改userdal和userbll对象,代码如下:

    public class UserDAL
    {
        NPOIDataTestEntities entity = new NPOIDataTestEntities();

        public void AddUser(np_user user)
        {
            entity.AddTonp_user(user);
            entity.SaveChanges();
        }

        public np_dept GetSingleDept(int deptID)
        {
            return entity.np_dept.FirstOrDefault(x => x.deptID == deptID);
        }
    }

    public class UserBLL
    {
        UserDAL dal = new UserDAL();

        public void AddUser(np_user user)
        {
            dal.AddUser(user);
        }

        public np_dept GetSingleDept(int deptid)
        {
            return dal.GetSingleDept(deptid);
        }
    }

页面调用:

    protected void Page_Load(object sender, EventArgs e)
    {
        UserBLL userdal = new UserBLL();

        userdal.AddUser(new np_user()
            {
                userName = "wwww",
                //修改的地方
                np_dept = userdal.GetSingleDept(1)
            });
    }

如此,页面就不会出现问题了.

最后:

如果建立edmx文件时,选中了"在模型中加入外键列"复选框,即可直接对deptid直接赋值,这一切问题都不会出现.