初学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直接赋值,这一切问题都不会出现.