操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null
报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null 。
同时修改主表和从表的数据,想用EF主表T_ReviewPlan中某个对象item删除item对应的从表T_ReviewSubject中的数据,结果报错。
解决方法: db.从表.RemoveRange(需要删除的从表对象的集合)
db.T_ReviewSubject.RemoveRange(item.T_ReviewSubject);
var item = db.T_ReviewPlan.Where(d => d.ReviewPlanID == info.ReviewPlanID).SingleOrDefault();
if (item != null)
{
item.ProjectID = info.ProjectID;
item.UserID = info.UserID;
item.ReviewDocumentName = info.ReviewDocumentName;
item.Content = info.Content;
item.PublishDate = DateTime.Now;
item.DeadlineDate = info.DeadlineDate;
// item.T_ReviewSubject.Clear();
db.T_ReviewSubject.RemoveRange(item.T_ReviewSubject);
db.SaveChanges();
var reviewSubject = info.reviewSubject.Distinct();
foreach (var id in reviewSubject)
{
var au = new T_ReviewSubject();
au.ReviewPlanID = item.ReviewPlanID;
au.SubjectID = id;
au.SubmitDate = DateTime.Now;
db.T_ReviewSubject.Add(au);
} db.SaveChanges();
进一步完善:添加事务,出错回滚。
var item = db.T_ReviewPlan.Where(d => d.ReviewPlanID == info.ReviewPlanID).SingleOrDefault(); if (item != null)
{
var tran = db.Database.BeginTransaction();//开启事务
try
{
item.ProjectID = info.ProjectID;
item.UserID = info.UserID;
item.ReviewDocumentName = info.ReviewDocumentName;
item.Content = info.Content;
item.PublishDate = DateTime.Now;
item.DeadlineDate = info.DeadlineDate;
// item.T_ReviewSubject.Clear();
db.T_ReviewSubject.RemoveRange(item.T_ReviewSubject);
db.SaveChanges();
var reviewSubject = info.reviewSubject.Distinct();
foreach (var id in reviewSubject)
{
var au = new T_ReviewSubject();
au.ReviewPlanID = item.ReviewPlanID;
au.SubjectID = id;
au.SubmitDate = DateTime.Now;
db.T_ReviewSubject.Add(au);
} db.SaveChanges();
tran.Commit();//必须调用Commit(),否则不报错数据也不会保存
}
catch (Exception ex)
{
tran.Rollback();//出错回滚
throw ex;
//加throw继续向外抛出异常,不加则不再向外抛出异常。
//一般建议不要抛出异常而是返回false和一个自定义错误提示语。
//猜想:EF内部可能自动实现了回滚机制,只这种回滚是单步的,更多步骤的回滚需要我们自己书写。
}
}
操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null的更多相关文章
- 修改bug 提交出错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null
提交出错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null.对关系作出更改后,会将相关的外键属性设置为 null 值.如果外键不支持 null 值,则必须定义新的关系,必须向外键属性 ...
- Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性
在.NET 4.0 的EF 中,增加了FK Associations 的功能,但是在.NET 3.5 SP1 中,仅仅支持独立的关联,这意味着FK 栏位不能作为实体的属性来使用,也就是说在使用的时候, ...
- Navicat图形更改表结构的时,设置外键时出现1452错误
原文地址:http://www.mamicode.com/info-detail-1296600.html 提示1452错误,如下图所示. 然后百度了一下,得到了一个靠谱的答案: 这是因为表设置了外键 ...
- Entity Framework 一个表多个外键关联另外一张表的相同主键
一. 报错 异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错.有关详细信息,请参阅内部异常. ---> System ...
- SQLAlchemy-对象关系教程ORM-一对多(外键),一对一,多对多
一:一对多 表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类,然后,在父表类中通过 relationship() 方法来引用子表的类. 在一对多的关系中建立双向的关系,这 ...
- Hibernate关系映射(一) 基于外键的单向一对一
模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; ...
- Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...
- T-SQL中找出一个表的所有外键关联表
二种方法(下例中表名为T_Work) 1.SQL查询系统表 SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.r ...
- mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...
随机推荐
- 28.TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在前一篇中详细讲解了TreeMap实现机制,如果客官详细看了这篇博文或者对TreeMap有比较详细的了解,那 ...
- Python 递归 Resursion()
条件: ①递归有最小值或有确定值 ②fun(x) = ax * bfun(x-1) 类似规则 eg. n! : ①1! = 1 ②n! = n* (n-1)! def factorial (n): ...
- 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...
- 数据结构(二): 轻量级键值对 SparseArray
SparseArray是Android framework中提供的轻量级的键值对数据结构,我们知道空间和效率从来都是相悖的,SparseArray的实现正是以时间来换取空间效率,适合小规模数据的存储. ...
- Vue过渡mode属性踩坑
近期学习Vue的过渡效果的时候,mode属性的"in-out"."out-in"设置了不起作用,官网上的例子让我看了有点迷,问题解决后以此文记录之. 首先我们看 ...
- Oracle实战笔记(第一天)
导读 笔记内容来自韩顺平老师的视频<玩转Oracle实战教程>,可以结合笔记进行观看.第一天视频中还有Oracle的介绍和安装等内容,很容易搜索到,这里就不再进行总结. 目录 1.命令行工 ...
- Winginx nginx 启动提示80端口被占用
第一步:查看80端口占用信息 win键+R运行命令:cmd-->netstat -aon|findstr "80" 2.结束任务 找到 pin=4272这个进程,将进程结束 ...
- 带你一文了解Python中的运算符
运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...
- SPA架构的优点和缺点以及一些思考
SPA是什么? 全称是单页面应用. 一个SPA就是一个WEB应用,它所需的资源(HTML CSS JS等),在一次请求中就加载完成,也就是不需刷新地动态加载. 用术语“单页”就是因为页面在初始化加载后 ...
- Python档案袋(变量与流程控制)
变量与运算 得到数据类型: ii=100 print(type(ii)) #输出:<class 'int'> 强制转换: ii=100 iix=str(ii) #可为int str flo ...