EF多表外键关联,新增数据的时候外键错误

报错:(外键FK_Base_RoleRight_Base_Role约束错误,要求在dbo.Base_Roles表中的列名"Roles_ID"的值存在)

The INSERT statement conflicted with the FOREIGN KEY constraint “FK_Base_RoleRight_Base_Roles”. The conflict occurred in database “SAM_DB”, table “dbo.Base_Roles”, column ‘Roles_ID’.
The statement has been terminated.

原来写法:

using (TransactionScope trans = new TransactionScope())
{
	//增加角色信息
	 db.Add(info.MapTo<Base_Roles>());

	//增加角色-权限 信息   
	db.Base_RoleRight.AddRange(info.Base_RoleRight.MapToList<Base_RoleRight>());
                       
	result = db.SaveChanges();
}

SQLServer Profiler监测:

在这里插入图片描述

正确写法:(增加db.SaveChanges()😉

using (TransactionScope trans = new TransactionScope())
{
     db.Add(info.MapTo<Base_Roles>());

     db.SaveChanges();

     db.Base_RoleRight.AddRange(info.Base_RoleRight.MapToList<Base_RoleRight>());
                       
     result = db.SaveChanges();
                        
     trans.Complete();
                        
     return result;
 }

SQLServer Profiler监测:
在这里插入图片描述

再来看一个用户添加的例子:


 using (TransactionScope trans = new TransactionScope())
{
 	
 		db.Base_UserInfo.Add(base_UserInfoDto.MapTo<Base_UserInfo>());

        db.SaveChanges();
                                 					
       	db.Base_UserRight.AddRange(base_UserInfoDto.Base_UserRightDtoList.MapToList<Base_UserRight>());

        db.Base_StaffOrganize.AddRange(base_UserInfoDto.Base_StaffOrganizeDtoList.MapToList<Base_StaffOrganize>());

        db.Base_UserRole.AddRange(base_UserInfoDto.Base_UserRoleDtoList.MapToList<Base_UserRole>());

        db.Base_AppendPropertyInstance.AddRange(base_UserInfoDto.Base_AppendPropertyInstanceDtoList.MapToList<Base_AppendPropertyInstance>());

        result = db.SaveChanges();

        trans.Complete();
 }

SQLServer Profiler监测:

在这里插入图片描述
结论:RPC:Completed 执行的时候SQL顺序与代码的SQL顺序不一致。通过在每行EF语句间添加db.SaveChanges()执行顺序才会一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值