初學Entity Framework,添加數據時,提示"一個實體對象不能由多個 IEntityChangeTracker 實例引用"這個問題,添加不成功.調試很久,發現問題所在.先說下環境.
.net framework版本:
4.0
Microsoft Visual Studio版本:
2010
Microsoft Sql Server版本:
2008
使用表關系圖:
兩個表數據如下:
前提:
之前建立edmx文件時,未選中"在模型中加入外鍵列"復選框.現在模擬這種情況。
建立Edmx:
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) }); }
提示錯誤:
原因:
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直接賦值,這一切問題都不會出現.