报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 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的更多相关文章

  1. 修改bug 提交出错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null

    提交出错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null.对关系作出更改后,会将相关的外键属性设置为 null 值.如果外键不支持 null 值,则必须定义新的关系,必须向外键属性 ...

  2. Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性

    在.NET 4.0 的EF 中,增加了FK Associations 的功能,但是在.NET 3.5 SP1 中,仅仅支持独立的关联,这意味着FK 栏位不能作为实体的属性来使用,也就是说在使用的时候, ...

  3. Navicat图形更改表结构的时,设置外键时出现1452错误

    原文地址:http://www.mamicode.com/info-detail-1296600.html 提示1452错误,如下图所示. 然后百度了一下,得到了一个靠谱的答案: 这是因为表设置了外键 ...

  4. Entity Framework 一个表多个外键关联另外一张表的相同主键

    一. 报错 异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错.有关详细信息,请参阅内部异常. ---> System ...

  5. SQLAlchemy-对象关系教程ORM-一对多(外键),一对一,多对多

    一:一对多 表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类,然后,在父表类中通过 relationship() 方法来引用子表的类. 在一对多的关系中建立双向的关系,这 ...

  6. Hibernate关系映射(一) 基于外键的单向一对一

    模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; ...

  7. Hibernate关系映射(二) 基于外键的双向一对一

    基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...

  8. T-SQL中找出一个表的所有外键关联表

    二种方法(下例中表名为T_Work) 1.SQL查询系统表 SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.r ...

  9. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

随机推荐

  1. VSCode插件开发全攻略(四)命令、菜单、快捷键

    更多文章请戳VSCode插件开发全攻略系列目录导航. 命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode. ...

  2. MySQL--Insert Buffer

    在进行数据插入时,需要将数据插入到聚集索引和非聚集索引中,而对于非聚集索引,需要先确定数据要插入的索引页,再将索引页加载到内存中进行修改,而在业务上很难保证插入数据在非聚集索引上也是连续的,因此插入操 ...

  3. 全国计算机等级考试二级Python语言程序设计考试大纲

    全国计算机等级考试二级Python语言程序设计考试大纲(2018年版) 基本要求 掌握Python语言的基本语法规则. 掌握不少于2个基本的Python标准库. 掌握不少于2个Python第三方库,掌 ...

  4. PostgreSQL查看表、表索引、视图、表结构

    -- 表索引select * from pg_indexes where tablename='person_wechat_label';select * from pg_statio_all_ind ...

  5. [Vuejs] svg-sprite-loader实现加载svg自定义组件

    1.安装 svg-sprite-loader npm install svg-sprite-loader -D 或者 npm install svg-sprite-loader --save-dev ...

  6. postgresql 日志配置

    Postgresql日志收集   PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_col ...

  7. php过滤&nbsp;字符

    今天在抓取页面中得到字符串:"卡牌 ",使用str_replace . preg_replace 和 strip_tags过滤都无解. 最后google到2种方式,如下: str_ ...

  8. axios的秘密

    vue自2.0开始,vue-resource不再作为官方推荐的ajax方案,转而推荐使用axios. 按照作者的原话来说: “Ajax 本身跟 Vue 并没有什么需要特别整合的地方,使用 fetch ...

  9. 【ABP框架系列学习】N层架构(3)

    目录 0.引言 1.DDD分层 2.ABP应用构架模型 客户端应用程序(Client Applications) 表现层(Presentation Layer) 分布式服务层(Distributed ...

  10. vue 项目实战 (vue全家桶之--- vuex)

    老规矩先安装 npm install vuex --save 在看下面内容之前 你应该大概的看了一边vuex官方的文档对vuex有个大概对了解 首先 vuex 是什么? vuex 是属于vue中的什么 ...