• 一个实体对象不能由多个 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直接赋值,这一切问题都不会出现.

  • 相关阅读:
    Lodash 严重安全漏洞背后 你不得不知道的 JavaScript 知识
    SQL Server和C#中无法将小数字符串直接转换为整数类型
    Is default(CancellationToken) equivalent to CancellationToken.None?(转载)
    Stored Procedures: OUTPUT vs OUT?(转载)
    关于TransactionScope.Complete方法(链接)
    Do I need to dispose of Tasks?(链接)
    EF Core 3.0 Keyless Entity Types (链接)
    为什么C#接口中不能声明async异步函数(转载)
    How does SqlDataReader handle really large queries?(转载)
    ASP.NET Core MVC中的Filter如果不实现IFilterFactory接口,那么Filter默认情况下在ASP.NET Core生命周期内是单例的,会被重用
  • 原文地址:https://www.cnblogs.com/oneword/p/2404967.html
Copyright © 2020-2023  润新知