一個實體對象不能由多個 IEntityChangeTracker 實例引用


初學Entity Framework,添加數據時,提示"一個實體對象不能由多個 IEntityChangeTracker 實例引用"這個問題,添加不成功.調試很久,發現問題所在.先說下環境.

.net framework版本:

4.0

Microsoft Visual Studio版本:

2010

Microsoft Sql Server版本:

2008

使用表關系圖:

image

兩個表數據如下:

image 

前提:

之前建立edmx文件時,未選中"在模型中加入外鍵列"復選框.現在模擬這種情況。

image

建立Edmx:

image

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)
            });
    }

提示錯誤:

image

原因:

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直接賦值,這一切問題都不會出現.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM