报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 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. HDU1262-寻找素数对

    //#include<bits/stdc++.h> #include<map> #include<cstdio> #include<string> #i ...

  2. Calendar and GregorianCalendar

    1.GregorianCalendar是Calendar的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统 2.注意 (1)月份:1月到12月[0-11] (2)星期:周日到周六[1-7] ...

  3. build.gradle

    1.将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = f ...

  4. prim最小生成树

    prim和DIjkstra相似,都使用了贪心策略,加一些限制条件. prim每次会找出尽量小的那个边,将其加入到树中,最终使得生成树长大. 树中有n-1个节点时或者剩下的所有边都是INF,算法结束. ...

  5. Promise(一)

    每个Promise对象就是一个值的代理,这个值在Promise创建时可以是未知的.Promise对象允许你为异步事件的成功操作和失败操作分别绑定对应的处理方法,让异步方法可以像同步方法那样返回值,但不 ...

  6. selenium+phantomjs+pyquery 爬取淘宝商品信息

    from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium ...

  7. Hadoop集群及基本组件搭建

    本人采用一个master和两个slave的网络结构,具体搭建如下 1.准备安装包 1.下载安装包 http://pan.baidu.com/s/1jIoZulw 2.安装包清单 scala-2.12. ...

  8. 背水一战 Windows 10 (119) - 后台任务: 后台下载任务(任务分组,组完成后触发后台任务)

    [源码下载] 背水一战 Windows 10 (119) - 后台任务: 后台下载任务(任务分组,组完成后触发后台任务) 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下 ...

  9. Canal学习笔记(服务端)

    canal服务端 canal服务端有两种运行模式,一种单机模式,一种HA运行模式(zk保证) 单机模式:同步的binlog节点信息保存在本地(/conf/{自定义分区文件夹}/),meta.dat H ...

  10. Java程序入口:main()方法讲解

    Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中, ♦ public修饰符:Java类由JVM调用,为 ...