报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 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. “PurMVC”在Unity中的应用

    序章: 这是"游戏设计进阶技巧篇"内容,游戏中不使用如下技巧也可以正常运行,但是有了它以后可以增加项目的可读性,使功能”模块化“,”可视化“,”装逼化“(慢慢的恶意>,> ...

  2. wxPython 的简单框架实例

    #coding:utf-8 import wx def load(event): file = open(filename.GetValue(),'r') contents.SetValue(file ...

  3. MFC对话框和属性表

    对话框主要有两类,分为模式和无模式,它们的功能都被封装在了CDialog中.与对话框相近的是属性表,属性表实际上是具有制表页(TAB 页)的对话框,将对话框中控件更好的组织在一起.借助Cpropert ...

  4. Python之旅Day13 JavaScript与DOM部分

    JavaScript部分 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应的代码,浏览器就可以解释并做出相应的 ...

  5. package-lock.json,我们应该了解

    原谅我占2017年12月31日一个坑,后续补上

  6. 【高速接口-RapidIO】1、RapidIO协议概述

    一.RapidIO背景介绍 RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能. 低引脚数. 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放 ...

  7. Android语音识别

    语音识别 - 科大讯飞 开放平台 http://open.voicecloud.cn/ 需要拷贝lib.assets.并在清单文件中写一些权限 public class MainActivity ex ...

  8. 从零开始单排学设计模式「策略模式」黑铁 II

    阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...

  9. openjtag 的硬件连接踩坑历程

    这个事情踩了不少坑,这个要记录一下: 1 代码的下载和编译按照下面的来:https://github.com/pulp-platform/pulp-debug-bridge 注意点: A 要最好使用p ...

  10. new 操作符 做了什么

    new 操作符 做了什么 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 假设Test是一个构造函数,通常在创建对象的实例时,要使用new,eg:test = new ...