-
2019-05-09 14:48:20
实体完整性规则是指若属性A是基本关系R的主属性 ,则属性A不能取空值。若外键不是主属性,则可以取空值,反之不可以取空值。
更多相关内容 -
System.InvalidOperationException:“操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。...
2019-06-26 15:19:04今天用EF做更新操作时,抛出了System.InvalidOperationException:“操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。对关系作出更改后,会将相关的外键属性设置为 null 值。如果外键不支持 null 值,...前言
今天用EF做更新操作时,抛出了System.InvalidOperationException:“操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。对关系作出更改后,会将相关的外键属性设置为 null 值。如果外键不支持 null 值,则必须定义新的关系,必须向外键属性分配另一个非 null 值,或必须删除无关的对象。”的异常。经过调试之后发现了问题所在。
报错代码:
public void Update(HouseDTO house) { using (ZMZDBEntities ctx = new ZMZDBEntities()) { var bs = new BaseService<HouseEntity>(ctx); var entity = bs.GetById(house.Id); if (entity != null) { entity.Address = house.Address; entity.Area = house.Area; entity.HouseAttachments.Clear();//先删再加 foreach (var aid in house.AttachmentIds) { entity.HouseAttachments.Add(new HouseAttachmentEntity { AttachmentId = aid, HouseId = house.Id }); } entity.CheckInDateTime = house.CheckInDateTime; entity.CommunityId = house.CommunityId; entity.DecorateStatuesId = house.DecorateStatusId; entity.Description = house.Description; entity.Direction = house.Direction; entity.FloorIndex = house.FloorIndex; entity.LookableDateTime = house.LookableDateTime; entity.MonthRent = house.MonthRent; entity.OwnerName = house.OwnerName; entity.OwnerPhoneNum = house.OwnerPhoneNum; entity.RoomTypeId = house.RoomTypeId; entity.StatusId = house.StatusId; entity.TotalFloorCount = house.TotalFloorCount; entity.TypeId = house.TypeId; entity.Address = house.Address; entity.Area = house.Area; ctx.SaveChanges(); } } }
当执行到
ctx.SaveChanges()
是就抛出了异常,而引起问题的代码实际在这里:entity.HouseAttachments.Clear();//先删再加 foreach (var aid in house.AttachmentIds) { entity.HouseAttachments.Add(new HouseAttachmentEntity { AttachmentId = aid, HouseId = house.Id }); }
这里涉及了三个表House、Attachment和HouseAttachment(中间表,只有Id主键,HouseId外键,AttachmentId外键三个字段)。当Clear掉House对应的Attachement时,HouseAttachment就和House脱离了关系(注意:当执行Clear时EF认为我们是要二者脱离关系,而我们的想法是删除House对应的HouseAttachments)。因为是脱离关系,所以HouseAttachment中House对应的外键字段就会被设置为null,以可被其它House所继续关联。而由于HouseAttachment表的HouseId(外键)为非空类型,所以SaveChanges时就报了应为非null的异常。至于EF为什么要这么做,就要理解下EF的 复合(Composition)和聚集(Aggregation)。
分析
对于复合:当父对象创建时子对象也会一并创建,当父对象销毁时子对象也一并销毁,父对象控制着子对象的生命周期。举个例子:你发布了一篇博客,并在博客里上传了一些附件,当你删除这篇博客时对应的附件也应该要一起删掉。
对于聚集:父对象和子对象是独立存在的,当父对象销毁时,子对象仍然可以存在(因为可能会被用到其它父对象中)。举个例子:一个歌单里包括了好几首歌,当这个歌单删除时,它对应的歌曲不应该被删除,因为还可以被加入到其它歌单里。
对于上述例子我们认为它应该是复合,但实际上EF认为是聚集。
EF则根据以下两点来区分复合还是聚集:
- 复合:如果EF在子对象中发现了复合主键(ParentId,ChildId),则认为是复合关系。对于此例来说如果HouseAttachment的Id和HouseId同时为主键,那么就不会报错了,然而我们的主键并不包括HouseId。
- 聚集:如果EF在子对象中发现了外键且不是复合主键,则认为是聚集关系。
所以走到这里问题也就明了了,解决方式有三种:
- 让EF认为我们这是复合关系,Clear时就删除对应的HouseAttachment:就需要将HouseAttachment的Id和HouseId同时设置为主键。
- 仍旧保持聚集关系:将HouseAttachment的HouseId字段设置为可空类型。
- 仍旧保持聚集关系:手动将house下的HouseAttachment删除,将出错代码改为
ctx.HouseAttachments.RemoveRange(entity.HouseAttachments); foreach(var aid in house.AttachmentIds) { ctx.HouseAttachments.Add(new HouseAttachmentEntity { AttachmentId = aid, HouseId = house.Id }); }
Inspired by
The relationship could not be changed because one or more of the foreign-key properties is non-nullable -
mysql 外键为空 查询出错
2021-01-19 04:56:19从后台查询项目出现问题,添加项目正常,但是在执行... 问题解决了,原来 hbm.xml文件中外键有一个属性是not-null,默认为true,若是需要外键为空必须将其改为false,问题就解决了……,晕,纠结了我两天……从后台查询项目出现问题,添加项目正常,但是在执行findProjectByAll()函数时出现问题,Hibernate:
select accounterd0_.id as id1_, accounterd0_.t_name as t2_1_,
accounterd0_.t_password as t3_1_, accounterd0_.t_role as t4_1_,
accounterd0_.t_remark as t5_1_ from t_accounter accounterd0_ where
accounterd0_.t_name=? and accounterd0_.t_password=? and
accounterd0_.t_role=?
Hibernate: select accounterd0_.id as id1_, accounterd0_.t_name as
t2_1_, accounterd0_.t_password as t3_1_, accounterd0_.t_role as
t4_1_, accounterd0_.t_remark as t5_1_ from t_accounter accounterd0_
where accounterd0_.t_name=? and accounterd0_.t_password=? and
accounterd0_.t_role=?
Hibernate: select accounterd0_.id as id1_, accounterd0_.t_name as
t2_1_, accounterd0_.t_password as t3_1_, accounterd0_.t_role as
t4_1_, accounterd0_.t_remark as t5_1_ from t_accounter accounterd0_
where accounterd0_.t_name=? and accounterd0_.t_password=? and
accounterd0_.t_role=?
Hibernate: select projectdao0_.id as id2_, projectdao0_.t_name as
t2_2_, projectdao0_.t_code as t3_2_, projectdao0_.t_sort as t4_2_,
projectdao0_.t_sort_code as t5_2_, projectdao0_.t_start_date as
t6_2_, projectdao0_.t_end_date as t7_2_, projectdao0_.t_fund_amount
as t8_2_, projectdao0_.t_fund_source as t9_2_,
projectdao0_.t_last_income as t10_2_, projectdao0_.t_total_income
as t11_2_, projectdao0_.t_income_note as t12_2_,
projectdao0_.t_budget_status as t13_2_, projectdao0_.t_if_end as
t14_2_, projectdao0_.t_fact_end_date as t15_2_,
projectdao0_.t_loan_status as t16_2_, projectdao0_.t_loaning as
t17_2_, projectdao0_.t_remark as t18_2_, projectdao0_.user_id as
user19_2_, projectdao0_.accounter_id as accounter20_2_ from
t_project projectdao0_
10:22:33,277 ERROR ProjectDao:116 -
啥问题呢,还以为是添加项目是没有添加外键取不到关联表的信息,但是修改程序后还是这样子
调了好久怀疑可能是外键accounter_id的为null的问题,手动将这个属性值改为1,发现问题就解决了;
可是Project这条记录和Accounter的关联关系还没有确定怎么能够确定外键值呢,怎么办?
问题解决了,原来
hbm.xml文件中外键有一个属性是not-null,默认为true,若是需要外键为空必须将其改为false,问题就解决了……,晕,纠结了我两天……
-
外键值可为空
2016-10-11 19:44:26从感官上,外键用于限制主子表的关联关系,是一种强关联关系,那么子表的外键值不应该为空,而是都会关联到主表对应的记录上,但实际上,至少在Oracle中,外键是可以为空的,打个比方,班级是主表,学生是子表,一个...原文地址:http://blog.csdn.net/bisal/article/details/49706273
从感官上,外键用于限制主子表的关联关系,是一种强关联关系,那么子表的外键值不应该为空,而是都会关联到主表对应的记录上,但实际上,至少在Oracle中,外键是可以为空的,打个比方,班级是主表,学生是子表,一个班级有多名学生,一名学生肯定会关联到一个存在的班级,但来了一个转校生,还没有分班,他现在属于学生子表,但还没有关联到班级主表中的任何一条记录。
实验:
1.创建主表T_A,子表T_B,子表A_ID列作为外键关联到主表T_A的主键ID字段。SQL> create table t_a( id number, name varchar2(1)); Table created. SQL> alter table t_a add constraint pk_t_a primary key(id); Table altered. SQL> create table t_b(id number, a_id number, name varchar2(1)); Table created. SQL> alter table t_b add constraint pk_t_b primary key(id); Table altered. SQL> alter table t_b add constraint fk_b_a foreign key(a_id) references t_a(id); Table altered.
2.插入记录,其中T_B表的一条记录标明A_ID字段值为空。
SQL> insert into t_a values(1, 'a'); 1 row created. SQL> insert into t_b values(1, 1, 'b'); 1 row created. SQL> insert into t_b values(2, '', 'c'); 1 row created. SQL> select * from t_a; ID N ---------- - 1 a SQL> select * from t_b; ID A_ID N ---------- ---------- - 1 1 b 2 c
可以插入,说明外键字段是可以为空。3.直接删除有关联子表记录的主表记录时,会报错:
SQL> delete from t_a where id=1; delete from t_a where id=1 * ERROR at line 1: ORA-02292: integrity constraint (BISAL.FK_B_A) violated - child record found
4.先删除子表记录,再删除主表对应的记录,则可以执行。
SQL> delete from t_b where id=1; 1 row deleted. SQL> delete from t_a where id=1; 1 row deleted.
-
EFCore——为什么除了外键还要额外属性(10)
2022-01-03 12:17:00为什么使用额外属性 一、一对多关系的数据获取 二、当我们想只想查评论对应的文章id就需要设置额外属性 一、一对多关系的数据获取 1.设置导航属性 2.当我们设置了两个实体一对多的导航属性后, 然后去获取他们的数据... -
mysql字符串类型、列属性及外键
2021-01-19 03:33:32字符串类型Char 和varchar在定义char 跟varchar时,都需要设置长度。语法:char(M); 最大长度为255varchar(M); 最大长度为65532不同编码长度...效率更快,使用一些固定字符长度的时候可以使用,例:电话号码、身份... -
SQL Server外键关系是强制约束,外键值也可以是空(NULL)
2019-10-06 20:51:35在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束无关。 我们先在SQL Server数据库中建立两张表People和Car,一个People可以有多个Car,所以这两张表是一对多关系。 建立表 ... -
关于hibernate的关联外键生成以及外键属性列的正确插入即:解决外键插入时,在关联表中除了外键列为空,...
2019-11-15 11:37:47关于hibernate的关联外键生成以及外键属性列的正确插入即:解决外键插入时,在关联表中除了外键列为空,其它属性均正常级联保存 其实解决办法十分简单: 首先确保你能够级联保存数据,当然除了关联表的外键列,我们... -
Django框架(之六)数据库模型属性和外键
2020-12-30 15:47:56Django框架(之六)数据库模型属性和外键 一、ORM常用字段 常用字段 含义 AutoField 映射到数据库中是int类型,可以有自动增长的特性 BigAutoField 64位的整形,类似于AutoField,数据的范围是从1-... -
JPA的@JoinColumn 注解问题,提示外键列不能为空
2017-07-31 09:37:35源实体中使用@JoinColumn指定外键(为参考实体的主键): ``` @ManyToOne(cascade={CascadeType....即DD_TYPE_ID列不能为空,但不是通过type属性传递了吗?如果不是这样传递,外键列的值应该是怎么设置的? -
第二章 外键定义
2021-07-21 08:30:00请注意,还可以通过定义连接类的关系属性来强制引用完整性。 详细 外键定义具有以下结构: /// description ForeignKey name(key_props) References referenced_class(ref_index) [ keyword_list ]; des -
EF 外键关系
2021-05-24 17:04:57实体加载方式: Lazy Loading 延迟加载; 使用的是动态代理,默认情况下, 如果POCO类满足以下两个条件,EF就...不设置导航属性为virtual,并且对导航属性使用Include,Eager Loading使用Include方法关联预先加载的实体 -
oracle 主键,非空,检查,唯一,默认,外键约束
2021-05-07 12:48:40不知道为什么,之前是可以的,突然就不行了. 解决方案 在drawable文件夹的目录上右键,选择Re ... ruby 疑难点之—— yield 和 yield self yield 所有的"方法(methods)"隐式跟上一个"块(block)"参数. 块参数也可以明确... -
解决spring-data-jpa 级联添加时,主表放弃对外键维护时外键字段为null
2020-01-30 13:57:21在spring-data-jpa中使用级联添加,一次添加多条数据时,在主表上放弃对外键维护时,添加数据到数据库,从表的外键字段为null值,当不放弃主表对外键的维护时,又正常添加。 主表对应实体类(Team,一的一方) @Entity ... -
Mysql数据库中外键作用及属性
2016-01-20 17:47:502.建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表的主键)。 3.事件触发限制: on delete(删除)和on update (更新), cascade:可设参数(跟随外键改动), restrict:(限制外表中的外 -
laravel-nullable-field:自动为laravel中的空字段设置空值
2021-04-27 13:19:11当分配给给定属性的值为null时,Laravel(5.1)当前不支持将可为空的数据库字段自动设置为null 。 安装 此特征是通过安装的。 要安装,只需将其添加到您的composer.json文件中: { "require": { "bluecode/... -
查询多个表,包括具有空外键MySQL的行
2021-03-14 01:39:33其他id列只是整数外键(默认为null). 我还需要一个查询,也包括产品表上带有null id_manufacturer和/或id_supplier的行. product表中的那些空字段返回值’0′,所以当我进行查询时 SELECT category.id_product, ... -
sql主键和外键有什么区别
2021-01-19 21:37:20sql主键和外键的区别:1、主键是唯一标识一条记录,不能有重复,不允许为空,而外键可以重复,可以是空值;2、主键是用来保持数据完整性,外键是用来建立与其他表联系用的;3、主键只有一个,外键可以有多个。sql... -
Django学习-第七讲:django 中的常用字段、字段属性,外键和表关系、外键操作
2020-10-13 20:47:06映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用AutoField也... -
Spring-Data-JPA 一对多关联保存,关联外键字段为NUll
2020-09-04 17:58:13今天遇到一个问题,在使用Spring Data JPA一对多关联时候保存到数据库,数据都保存了,但是外键的值为空! 原因:实体类配置关联关系后还要在保存的时候体现出关联性。 实体类: package com.zzg.entity; ... -
在oracle中查询已知表名的表中所有字段名,每个字段是否是主键,是否是外键,是否为空的sql语句
2021-05-03 10:54:59查询表的所有列及其属性:select t.*,c.COMMENTSfrom user_tab_columns t,user_col_comments cwhere t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = women;查找表的主键:... -
导航属性(外键)
2016-02-17 15:12:00在年级对象类中根据年级编号来查询年级对象//写在if前面代表察回来值即使是空也没问题 因为==null6.创建学生编号的时候new 一个 年级对象并且调用年级对象的id将学生对象的id传递 2.cellformatting 事件 一个个的... -
数据库建表时一个表最多可以有几个主键,几个外键
2021-01-19 12:54:3162616964757a686964616fe58685e5aeb931333366306538外键就是自己设置了也即可以有多个,可以设置除主键以外的其他字段全部是外键的。数据库的每张表只能有一个主键,不可能有多个主键。所谓的一张表多个主键,我们称... -
数据库外键理论及MySQL外键实现规定
2021-12-17 10:35:301. 关系数据库外键概念理论(大学时学习的概念) 教材是:王珊,萨师煊老师的数据库系统概论——第五版,这里直接丢截图了。 有三类完整性约束,分别是:实体完整性、参照完整性以及用户定义的完整性。 其中实体... -
MySQL之 表的约束(空属性约束、默认值、列描述、zerofill、主键约束、自增长、唯一键约束、外键约束)
2019-08-02 17:33:48eg:创建一个班级表,包含班级名和班级所在的教室,如果班级没有名字,不知道在哪个班级,如果教室名字可以为空,就不知道在哪上课。 创建该表: 此时进行数据插入必须赋俩个值,否则就会报错。 2... -
MySQL 数据库添加数据时为什么会产生外码(外键)约束?原理就是什么?如何解决?
2019-06-11 19:01:51我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案... -
MySQL外键+唯一索引
2021-01-19 06:01:06外键是指一个表里的列与另一张表里的列进行关系连接,可用于使用简单的数字或字母替代复杂的数据结构,不仅可以节省空间,也拥有约束功能,可减少书写出错的机会。1.1使用方式constraint 变量名 foreign key (列名) ... -
关系模型的完整性规则。在参照完整性中,什么情况下外码属性的值可以为空值?
2018-05-04 00:21:14若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:或者取空值(F的每个属性值均为空值);或者等于S中某个元组的主码值... -
实例关联的外键对象不为空时保存出错
2012-05-15 10:10:34当表单提交的时候如果后台对应的order实例中person属性已经创建,也就是order中的person属性不为空,但是person的id是空的,则当orderDao.save(order);的时候后台就会报错,原因: 因为person的id是空的,但是... -
MySQL的几个概念:主键,外键,索引,唯一索引
2021-01-18 20:46:16概念:主键(primary key)能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库...