精华内容
下载资源
问答
  • 在参照完整性中,为什么外键属性值也可以,什么时候可以
    万次阅读
    2019-05-09 14:48:20

    实体完整性规则是指若属性A是基本关系R的主属性 ,则属性A不能取空值。若外键不是主属性,则可以取空值,反之不可以取空值。

    更多相关内容
  • 今天用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在子对象中发现了外键且不是复合主键,则认为是聚集关系。

    所以走到这里问题也就明了了,解决方式有三种:

    1. 让EF认为我们这是复合关系,Clear时就删除对应的HouseAttachment:就需要将HouseAttachment的Id和HouseId同时设置为主键。
    2. 仍旧保持聚集关系:将HouseAttachment的HouseId字段设置为可空类型。
    3. 仍旧保持聚集关系:手动将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

    展开全文
  • 从后台查询项目出现问题,添加项目正常,但是在执行... 问题解决了,原来 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.

    展开全文
  • 为什么使用额外属性 一、一对多关系的数据获取 二、当我们想只想查评论对应的文章id就需要设置额外属性 一、一对多关系的数据获取 1.设置导航属性 2.当我们设置了两个实体一对多的导航属性后, 然后去获取他们的数据...
  • 字符串类型Char 和varchar在定义char 跟varchar时,都需要设置长度。语法:char(M); 最大长度255varchar(M); 最大长度65532不同编码长度...效率更快,使用一些固定字符长度的时候可以使用,例:电话号码、身份...
  • 在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束无关。 我们先在SQL Server数据库中建立两张表People和Car,一个People可以有多个Car,所以这两张表是一对多关系。 建立表 ...
  • 关于hibernate的关联外键生成以及外键属性列的正确插入即:解决外键插入时,在关联表中除了外键列为,其它属性均正常级联保存 其实解决办法十分简单: 首先确保你能够级联保存数据,当然除了关联表的外键列,我们...
  • Django框架(之六)数据库模型属性外键 一、ORM常用字段 常用字段 含义 AutoField 映射到数据库中是int类型,可以有自动增长的特性 BigAutoField 64位的整形,类似于AutoField,数据的范围是从1-...
  • 源实体中使用@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方法关联预先加载的实体
  • 不知道为什么,之前是可以的,突然就不行了. 解决方案 在drawable文件夹的目录上右键,选择Re ... ruby 疑难点之—— yield 和 yield self yield 所有的"方法(methods)"隐式跟上一个"块(block)"参数. 块参数也可以明确...
  • 在spring-data-jpa中使用级联添加,一次添加多条数据时,在主表上放弃对外键维护时,添加数据到数据库,从表的外键字段null值,当不放弃主表对外键的维护时,又正常添加。 主表对应实体类(Team,一的一方) @Entity ...
  • 2.建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表的主键)。 3.事件触发限制: on delete(删除)和on update (更新),  cascade:可设参数(跟随外键改动),  restrict:(限制外表中的外
  • 当分配给给定属性的值null时,Laravel(5.1)当前不支持将可为空的数据库字段自动设置null 。 安装 此特征是通过安装的。 要安装,只需将其添加到您的composer.json文件中: { "require": { "bluecode/...
  • 其他id列只是整数外键(默认null). 我还需要一个查询,也包括产品表上带有null id_manufacturer和/或id_supplier的行. product表中的那些空字段返回值’0′,所以当我进行查询时 SELECT category.id_product, ...
  • sql主键和外键的区别:1、主键是唯一标识一条记录,不能有重复,不允许为空,而外键可以重复,可以是空值;2、主键是用来保持数据完整性,外键是用来建立与其他表联系用的;3、主键只有一个,外键可以有多个。sql...
  • 映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用AutoField也...
  • 今天遇到一个问题,在使用Spring Data JPA一对多关联时候保存到数据库,数据都保存了,但是外键的值为空! 原因:实体类配置关联关系后还要在保存的时候体现出关联性。 实体类: package com.zzg.entity; ...
  • 查询表的所有列及其属性: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 事件 一个个的...
  • 62616964757a686964616fe58685e5aeb931333366306538外键就是自己设置了也即可以有多个,可以设置除主键以外的其他字段全部是外键的。数据库的每张表只能有一个主键,不可能有多个主键。所谓的一张表多个主键,我们称...
  • 1. 关系数据库外键概念理论(大学时学习的概念) 教材是:王珊,萨师煊老师的数据库系统概论——第五版,这里直接丢截图了。 有三类完整性约束,分别是:实体完整性、参照完整性以及用户定义的完整性。 其中实体...
  • eg:创建一个班级表,包含班级名和班级所在的教室,如果班级没有名字,不知道在哪个班级,如果教室名字可以为空,就不知道在哪上课。 创建该表: 此时进行数据插入必须赋俩个值,否则就会报错。 2...
  • 我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案...
  • MySQL外键+唯一索引

    2021-01-19 06:01:06
    外键是指一个表里的列与另一张表里的列进行关系连接,可用于使用简单的数字或字母替代复杂的数据结构,不仅可以节省空间,也拥有约束功能,可减少书写出错的机会。1.1使用方式constraint 变量名 foreign key (列名) ...
  • 属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须:或者取空值(F的每个属性值均空值);或者等于S中某个元组的主码值...
  • 当表单提交的时候如果后台对应的order实例中person属性已经创建,也就是order中的person属性为空,但是person的id是的,则当orderDao.save(order);的时候后台就会报错,原因: 因为person的id是的,但是...
  • 概念:主键(primary key)能够唯一标识表中某一行的属性属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,097
精华内容 18,438
关键字:

为什么外键属性可以为空