报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 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. HTML5元素标记释义

    HTML5元素标记释义 标记 类型 意义 介绍 文件标记 <html> ● 根文件标记 让浏览器知道这是HTML 文件 META标记 <head> ● 开头 提供文件整体信息 ...

  2. C++的学习心得

    由于我们大一就学习的c++,跳过了c语言,VB的学习,在很多方面我们掌握的并不是特别好,在这几种语言中,几乎有时候会产生混淆,通过做大量的c++的题目感觉在题目中应用的最多的就是数组.指针.对类的应用 ...

  3. Git使用详细教程(4):git rm使用详解

    我们使用git rm 文件名来进行删除文件的操作. git rm index.php这个命令把工作区的index.php删除并暂存了. 如何撤回已暂存的删除命令? 上图中已经给出了提示,使用git r ...

  4. Linux 下 安装Python第三方模块工具箱pip,以及用pip安装的方法

    下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 可以做一个软连 ...

  5. 使用token和redis怎样判断账户是否失效和异地登录

    思路: 将token作为value,账户的id作为key 每次登录都去redis中查询该账户的登录是否过期,没有过期则删掉原来的id,token,将新生成token作为value存入redis中.过期 ...

  6. Spring Cloud是怎么运行的?

    导读 在之前的文章中给大家介绍了Spring Boot的基本运行原理(链接),收到了很多读者朋友们关于目前比较流行的微服务框架Spring Cloud的问题反馈.因此,在这篇文章中小码哥打算和大家一起 ...

  7. 原生端与服务器通过sessionid实现session共享以及登录验证

    注:原生端与服务器建立连接时产生的sessionid会变,跟上一次的不一样,为了保证sessionid一样,所以第一次服务器需要把sessionid返回给原生端,下一次与服务端会话时,原生端需要把这个 ...

  8. mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)

    一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...

  9. Linux编程 16 文件权限(组管理 groupadd, groupmod,文件权限介绍)

    一.用户组 前面章节知道用户账户在控制单个用户安全性方面很好,但涉及到共享资源或把用户类型分组时,组概念就出来了. 组权限允许多个用户对系统中的对象(比如文件,目录,设备等)共享一组共用的权限. 在c ...

  10. mysql 开发进阶篇系列 21 磁盘I/O问题(RAID)

    一.概述 作为应用系统的持久化层,不管数据库采取了什么样的Cache机制,数据库最终总是要将数据储存到可以长久保存的I/O设备磁盘上.但磁盘的存取速度显然要比cpu,ram的速度慢很多.因此,对于比较 ...