外键

EF配置模型

强颜欢笑 提交于 2020-03-23 23:07:08
配置方法 EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置。 Data Annotations翻译过来就是数据注解,是通过直接在实体类的属性上加注类似标签的东西达到对数据库的映射; 特记录下使用FluentAPI方式: 要使用Fluent API 就必须在你自定义的继承自DbContext的类中重载OnModelCreating这个方法 1.ToTable - TableAttribute:配置此实体类型映射到的表名 2.HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称 3.HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法 4.Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库 5.HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。 6.HasOptional:从此实体类型配置可选关系

EF Code First:实体映射

百般思念 提交于 2020-03-23 23:06:45
二、实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。DataAnnotation由命名空间System.ComponentModel.DataAnnotations提供。下面列举实体模型中常用的DataAnnotation特性: KeyAttribute:对应数据库中的主键 RequiredAttribute:对应数据库中字段的数据是否可以为null MaxLengthAttribute:对应数据库中字符串类型字段的最大长度 MinLengthAttribute:在数据库中无对应,但在代码中字符串最小长度 ConcurrencyCheckAttribute:指定用于开放式并发检查的列的数据类型 TimestampAttribute:将列的数据类型指定为行版本 System.ComponentModel.DataAnnotations命名空间中只定义了部分实体验证的特性,在EntityFramework程序集中定义了更多的数据映射特性: DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity当插入行时

MySql存储引擎介绍

半世苍凉 提交于 2020-03-23 13:01:28
MySQL5.5以后默认使用 InnoDB 存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。 若要修改默认引擎,可以修改配置文件中的default-storage-engine。可以通过:show variables like 'default_storage_engine';查看当前数据库到默认引擎。命令: show engines 和 show variables like 'have%' 可以列出当前数据库所支持到引擎。其中Value显示为disabled的记录表示数据库支持此引擎,而在数据库启动时被禁用。在MySQL5.1以后,INFORMATION_SCHEMA数据库中存在一个ENGINES的表,它提供的信息与show engines;语句完全一样,可以使用下面语句来查询哪些存储引擎支持事物处理:select engine from information_chema.engines where transactions = 'yes'; 可以通过engine关键字在创建或修改数据库时指定所使用到引擎。 主要存储引擎:MyISAM、InnoDB、MEMORY和MERGE介绍: 在创建表到时候通过 engine=... 或 type=... 来指定所要使用到引擎。 show table status from DBname 来查看指定表到引擎

hibernate关系映射

感情迁移 提交于 2020-03-23 13:00:01
关系映射 对象中的关系映射有如下四种,而且分为单向和双向两种,单向和双向的区别主要在java类中才会有区别,在数据库中时没区别的。 一对一 一对多 多对一 多对多 其中一对多双向关联和多对一双向关联是一样的。所以总的来说,我们要注意的关系映射有七种。 OneToOne(凡是双向,都要用mappedBy) 单向外键 使用annotation进行配置。如果使用annotation进行配置,那么和之前一样,首先要进行表的配置,即@Entity,还有id,自增等等,这里不做重复介绍。   在使用annotation进行单向配置的时候,比如存在这么两张表(husband、wife),那么就会存在husband和wife两个类文件,在husband中设置一个wife对象,然后再生成的getter方法前面用@onetoone进行注解,这样就表示进行了单向的关联。要注意,这里生成的外键的名字,也就是在表husband生成的字段的名字为wife属性名_id,如设置的wife属性为wife,那么自动生成的字段为wife_id。这样的操作明显不是我们想要的,如果想要设置成自己想要的字段名,可以在@onetoone下面再用一个新的注解:@joinColumn(name=”wifeId”),这样就表示把应的字段名设置为wifeId。 xml文件进行配置。使用xml文件进行配置的时候

Hibernate中的映射关系(一对多)

☆樱花仙子☆ 提交于 2020-03-23 12:58:22
在数据库中表和表之间的关系有几种,(一对一,一对多,多对多) 一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique='true']) 一对多关系:在多的一端插入一端的主键为外键(one-to-many<--->many-to-one) 多对多关系:新建一个表,选择两个表的主键为表的两个外键(many-to-many<-->many-to-many>) 关系配置步骤:   ①:分析1端和n端   ②:在1端插入n端的集合属性   ③:在n端插入一端的对象属性   ④:注明关系在那一段维护   基于xml文件格式配置 I单向一对一(以department和manager为例)   配置步骤:   ①:分析1端和n端(如果是一对一关系的时候,可以选择任意一方为N端,这里指定department为n端)   ②:在1端插入n端的集合属性(因为是一对一,所以不可以使集合对象属性,只能使用对象属性->private Department department)   ③:在n端插入一端的对象属性->private Manager manager   ④:注明关系在那一段维护:一般选择N端来维护关系 《使用many-to-one[unique='true']》   步骤:1在一对一关联的持久化类中互相添加对方对象属性,   

Hibernate学习之映射关系

 ̄綄美尐妖づ 提交于 2020-03-23 05:31:05
一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。   比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。      1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。   比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;   2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one> 二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。   比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。      1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;   2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。   所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。 此处的 foreign生成策略,会取得关联对象的标识, property标签内是关联 此处的

Django --- 基表 断关系 related_name on_delete

ぐ巨炮叔叔 提交于 2020-03-22 03:09:01
目录 基表 abstract 外键其他参数(重点) 补充: db_constraint=False related_name on_delete CASCADE:默认值,级联 DO_NOTHING:外键不会被级联 SET_DEFAULT: 设置为默认值 SET_NULL: 设置为null 基表 基表,为抽象表,是专门用来被继承,提供公有字段的,自身不会完成数据库迁移 abstract class BaseModel(models.Model): is_delete = models.BooleanField(default=False) create_time = models.DateTimeField(auto_now_add=True) class Meta: # 设置 abstract = True 来声明基表 作为基表的model 不能在数据库中有对应的表 abstract = False 外键其他参数(重点) 补充: 一对多 - 外键放多的一方 一对一 - 从逻辑正反向考虑,如作者表与作者详情表,作者删除级联删除详情,详情删除作者依旧存在,所以建议外键在详情表中 多对多 - 外键在查询频率高的一方 db_constraint=False 断关联表关系 1)不会影响连表查询操作效率 2)会提升连表增删改操作效率 3)易于后期数据库表的重构 4)缺点在于

约束5:外键约束

微笑、不失礼 提交于 2020-03-18 23:07:07
在关系型数据库中,表与表之间存在引用关系,也就是说,数据列C1引用其他表的数据列C2中存在的值,引用关系通过外键(Foreign Key )约束实现。如果表(TableA)中的列C1被其他表引用,那么,我们把表(TableA)称作参考表,或引用表(Referenced Table),该列C1是其他表的参考列,或引用列(Referenced Column),对引用列执行Update 或 Delete 操作会受到很多限制。某些情况下,也把参考表称作父表,把引用父表的列称作子列,或外键列。 [ FOREIGN KEY ] REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 例如,在数据列C1和C2之间创建外键约束,C1是引用列,C2列引用C1列的值,外键约束的特点: 如果C2列的值不是NULL,那么C2列的值必须存在于C1列中,否则,系统返回违反外键约束的错误; 外键约束可以创建在同一个表的不同列之间,这种引用类型称作自引用; 外键约束可以引用单列

数据库对象——表——轻松走进数据库之五

烈酒焚心 提交于 2020-03-18 05:08:01
基本数据库对象:表,视图,索引,触发器,存储过程,用户,图表,规则,默认值。 表:表示数据库中最最基本的对象,我们的数据都存放在表中。 表由行,列构成。列为字段,行为记录。一般我们在设计的表的时候操作的是列,在操作数据的时候用的是行。 一、表结构的操作: 表的基本操作:创建,修改,删除。 要创建一个表,上篇博客中写到,添加数据库对象就像是给大楼里招住户,表中的数据就是每个用户的家庭成员。表就是其中的住户。那么住户要搬进去,就要根据自己的需要给房间进行装修。放到数据库中,就是我们建表之前的设计阶段。 设计阶段要考虑什么呢? 建表不得不说的几个概念:约束,默认值,规则, 约束包括主键,外键,check,唯一性,null 。 主键:指定表的一列或几列在表中具有唯一性。 外键:是定义表之间的约束。例如:A表中的列跟B表中的主键相同时,可以将A表中的这列设置为A 表的外键。 Check:通过检查输入到列中的值来判断是否合理。 唯一性:用来确保不受主键约束的列上的数据的唯一性。 Null:该列是否可以为空值。 规则:对列中的数据和自定义数据类型的值进行的规定和限制。注意这里多了一个自定义和数据类型,约束中没有哦! 默认值:如果输入记录时,某列没有指定值,系统自动插入的值。 标识列:可以为某一列设置为标识列,这样就不必为这列赋值了,系统会自动添加行序号。但是这列数据类型必需是数据类型的哦

Django 查询操作

試著忘記壹切 提交于 2020-03-17 22:17:52
Django自动为所有的模型提供了一套完善、方便、高效的API。 本篇内容基于如下的一个博客应用模型: from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField