首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EF Core 导航属性配置

之前在说的时候,EF会根据导航属性自动生成一个外键,但是这一条在一对一这里就有点不太起作用了。所以我们必须手动在导航属性的一侧实体类里配置外键,并用 HasForeignKey指定。...表中生成了一个外键关系,在检索SingleTargetModel的时候,EF会从SingleModel表中检索对应的外键关系,并引入进来。...如果取消这行注释,EF会在SingleTargetModel表添加一个名为SingleId并指向SingleModel的外键,而取消SingleModel里的外键。...其他数据库提示,外键不能为空。 所以也就是说EF不推荐这种双方互导航的一对一关系。...如果要求非空,也就是导航属性的另一端必须存在则需要在配置关系的时候添加: IsRequired() 这个方法也用来声明字段是必须的。这个验证是在EF 调用 SaveChanges 的时候校验的。

3.3K20

ASP.NET MVC5高级编程——(3)MVC模式的模型

首先数据库中主外键的定义: 主键 外键 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 作用: 用来保证数据完整性 用来和其他表建立联系用的...个数: 主键只能有一个 一个表可以有多个外键 因为这个主外键属性对于理解后面的EF框架(ORM)很有帮助,所以这里我们多讲一些!...这是为了给EF框架提供一个钩子,即方便模型到数据库的映射,不理解就记住,后面的项目会详细讲解。 从上面三个类的代码可以看到,红色标记的是主键,而黄色的就是外键。...而称ArtistID属性为外键属性(foreign key),因为与模型对应的数据库中,专辑表(Album)和艺术家(Artist)表存在对应的外键关系,即ArtistID是Album表的外键!...当使用EF的代码优先方法时,需要使用从EF的DbContext类派生出的一个类来访问数据库。

4.8K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    01-EF Core笔记之创建模型

    数据标注方式比较简单,在类或字段上添加特性标注即可,对实体类型有一定的入侵。...FluentAPI方式通过在OnModelCreating方法中添加代码逻辑来完成,也可以通过实现IEntityTypeConfiguration类来完成,方式灵活,更能更加强大。...主键与数据库概念相一致,表示作为数据行的唯一标识;备用键是与主键相对应的一个概念,备用键字段的值可以唯一标识一条数据,它对应数据库的唯一约束。...public string TagId { get; set; } public Tag Tag { get; set; } } Blog和Tag是多对多的关系,显然无论在Blog或Tag中定义外键都不合适...当发现有继承关系时,EF Core会自动维护一个名为Discriminator的阴影属性,我们可以设置该字段的属性: modelBuilder.Entity() .Property(

    3.1K20

    C# 数据操作系列 - 6 EF Core 配置映射关系

    对于主键,默认情况下EF会检索实体类有没有名为Id或者类名+Id的属性,如果有EF则认为这个属性是主键,否则会认为该类没有设置主键。EF检索到主键的类型是数字类型的话,会自动添加自增长的约束。...对于其他属性,EF会自动按照同名的形式映射到数据表中。 对于外键,如果在类里添加了引用类型,而这个引用类型也在EF的上下文中,EF会把这种属性称为导航属性。...EF一旦在类里检索到了导航属性,就会去寻找对应的外键。EF会认为 属性名+Id或者类名+Id 可能是外键属性,如果找到名称一致且类型与导航属性目标类的主键类型一致,则认为是外键。...如果类型不一致,EF则认为该类设置有误。如果没找到符合名称要求的属性,EF会自己添加一个外键属性。 对于一对一,EF要求导航属性双方都应该具有外键配置。 一对多,EF要求多的一方设置外键。...表示实体映射的哪张表 [Key] KeyAttribute 用来标记哪个属性是主键 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 用来表示这个字段在第一次插入数据库时

    2.8K21

    关于EF Code First模式不同建模方式对建表产生的影响

    今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下: 1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下: //User类...结论:发现EF在我没有指定那个是主键的情况下,将UserId设为了主键 2、当一个实体中有两个带Id的字段,EF会将最像Id的设为主键,优先级  Id>UserId>UserId_Id class User...EF将Id设为了主键,UserId和UserId_Id的优先级自行验证. 3、关于外键的问题,当在实体中加入导航属性,EF生成外键可能会当前实体中的其他字段的影响.验证代码如下: class PhotoInfo...EF生成了一个User_Id的外键属性,关联User表 下面修改PhotoInfo实体,代码如下: class PhotoInfo { public Guid Id {...EF不再自动生成外键字段,而是将UserId属性设为了外键. 以上都是我测试出来的关于EF默认的行为,比较片面,欢迎指正.

    98760

    EntityFramework 外键值映射

    如果在 EF OnModelCreating 中配置了实体外键映射,也就是 SQL Server 中的 ForeignKey,那么我们在添加实体的时候,主实体的主键值会自动映射到子实体的外键值,并且这个操作在一个...SaveChanges 中,但如果没有在 OnModelCreating 中进行外键映射配置,我们添加实体的时候,就不会自动映射外键值了,什么意思呢?...可以看到 Student 中的 ClassId 字段并不是外键,下面我们添加 Student 和 Class 实体: static void Main(string[] args){ using...} 需要注意的是,我们并不需要在 OnModelCreating 中进行 Class 和 ClassId 的映射配置,EF 会自动查找 ClassId(属性名 + Id),所以,“外键”命名要注意规范统一...就是实体更改了,需要进行 EF 迁移,如果你进行 EF 迁移的话,会发现,虽然我们没有在 OnModelCreating 中进行 ClassId 外键映射配置,但 EF 也会自动映射 ForeignKey

    4.2K50

    Entity Framework 系统约定配置

    3.使用导航属性约束两个表之间的关系,在从表数据类中除了导航属性,推荐定义一个外键属性在从表数据类中(如果不指定将默认生成一个“+”的外键列;此外在主表中推荐定义一个集合从表属性用户导航...,当然这个属性不定义也可以正常生成外键关系但是不利于使用),具体规则:“+”或者“+”又或者“”,其属性名不区分大小写并且如果出现多种匹配按照先后顺序匹配...;如果不存在外键属性则外键关系注册为可选的,否则注册为必选项并且此时将设置级联删除关系;如果在从表类中有多个导航属性对应同一个数据类那么需要使用fluent API或者Data Annotations进行手动配置...4.当EF按照上述规则在数据类中没有找到主键属性时(或者通过fluent API、Data Annotations没有定义)将认为此类为“复杂类型”。   ...Entity Framework 手动定义约定  EF的默认约定不是一成不变的,我们可以选择移除和修改它,例如EF默认生成数据表时将数据类名的复数形式作为表名,下面的代码就可以移除这个规则: using

    84020

    EF Core的增删改查

    如果需要后续变更,那么就需要在创建自定义EF Core 上下文类的时候,为之添加一个连接字符串的属性或者字段,以方便初始化的时候指定。...1.2 配置文件的加载或者实体对象的托管 如果我们不使用配置文件的话,就必须在EF Core的上下文类里添加一个类型是DbSet的属性。...而删除,如果在配置导航属性时,没有设置级联删除,删除当前元素,如果另一端的外键是可空类型的,并不会删除导航属性另一端的元素只会设置外键指向为NULL,如果另一端外键是不可空的,那么就会同时删除。...: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项/子项的影响 Cascade 删除实体 删除实体 ClientSetNull(默认) 外键属性设置为 null None SetNull 外键属性设置为...null 外键属性设置为 null Restrict None None 而对于不可为NULL的外键来说,枚举DeleteBehavior的值起以下作用: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项

    3.2K20

    必会的这15个Mysql优化问题,面试官、DBA都要高看你一眼,速度收藏

    PS:以下正文中使用的数据库软件,是勇哥自己开发的,免费好用、可用SQL生成代码,请大家多支持:bg-boom-ui 开发过程如何排查SQL?...所以对于索引竟可能评估其带来的影响小于查询的收益,才去添加,而不是盲目的添加。...%88%E5%B5%A9%E5%B1%B1%E7%89%88%EF%BC%89.pdf 建表规约 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型为 unsigned tinyint...不得使用外键与级联,一切外键概念必须在应用层解决。 说明:以学生和成绩的关系为例,学生表的 student_id 是主键,成绩表的 student_id 则为外键。...外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。 禁止使用存储过程。存储过程难以调试和扩展,更没有移植性。

    70130

    Entity Framework 约定

    如果一个类中既没有id属性,也没有类名+id的属性,那么代码在运行时将会报错,因为EF没有找到符合要求的字段创建主键。...EF中定义关系要使用到导航属性,通过导航属性可以定义多个模型之间的关系。大部分情况下我们会将导航属性和外键属性结合在一起使用。...当EF检测出外键属性后,会根据外键属性是否为空来判断关系,如果外键可以为空,那么模型之间的关系将会配置成可选的,Code First 不会再关系上配置级联删除。...该模型将会自动被配置为复杂类型,检测复杂类型时要求该类型没有引用实体类型的属性。...我们只需要在 OnModelCreating 方法中加入如下代码即可: modelBuilder.Properties().Where(p => p.Name == "Id").Configure(p

    1.3K10

    EntityFramework Core 学习扫盲

    虽然我们目前还没有添加任何约束,但是EF Core会自动地根据Id/XXId的命名方式生成自增主键,而且如果没有在实体上增加[Table]Attribute的话,表的命名也是根据属性命名而定。...备用键 Alternate Keys是EF CORE引入的新功能,EF 6.X版本中并没有此功能。备用键可以用作实体中除主键和索引外的唯一标识符,还可以用作外键目标。...在Fluent Api中,有两种方法可以指定备用键,一种是当开发者将实体中的属性作为另一个实体的外键目标,另一种是手动指定。EF CORE的默认约束是前者。...再次重申一遍,备用键和主键有相似之处,它通常用来指定一个明确的外键目标——当开发者不想用单纯无意义的Id作为外键标识时。...虽然主体键也包括主键,但是主键在EF CORE中时强制定义的,所以HasPrincipalKey只会将属性配置为备用键。 2.

    9.6K90

    Entity Framework 基础知识走马观花

    例如:NavigationProperty 导航属性,因为T_Person表与T_Class、T_Message表都存在一对一或一对多的关系(即存在外键),因此在EF模型所生成的对象实体中,加入了外键所在实体的导航属性...在实际的开发中,我们往往会使用一些ORM框架例如EF去操作数据库,Where方法的使用则是每次调用都只是在后续生成SQL语句时增加一个查询条件,EF无法确定本次查询是否已经添加结束,所以没有办法木有办法在每个...3.3 使用Include提高查询效率   前面我们看到了延迟加载在EF中被广泛应用,但是延迟加载对于外键的加载也存在不足:那就是每次调用外键实体都会去查数据库。   ...(2)通过SQLServer Profiler跟踪,可以发现,每次调用外键实体属性时都会对数据库发出一起查询请求,从下图也可以看出,总共发出了接近10个请求; ?   ...(3)但是,EF也做了一个小优化:对于相同外键的加载请求,只会执行一次;例如,这里存在多个ClassId=1的Person记录,因此它们都只会执行一次即可; ?

    1.4K20

    EF 通过DataAnnotations配置属性和类型

    一、通过Attribute配置约束 1、主键约束 通过KeyAttribute来配置主键约束,代码如下: [Key] public int PrimaryKey{ get; set; } 2、外键约束...通过ForeignKeyAttribute来配置外键约束,代码如下: [Key] public int PrimaryKey{ get; set; } [ForeignKey("ForeignKey"...)] public int PrimaryKey{ get; set; } 注意,指定列名存在(外键必须存在),如上面的ForeignKey,则类中必须存在名称为ForeignKey的属性。...)] public GUID Id{ get; set; } 如果将属性标识为Computed,EF会认为该列是通过其它列计算得出的,不会将其持久化到数据库中。...{ get; set; } 这个就等同于Id主键自增效果 11、忽略列映射 当实体类中定义了某些字段,这些字段是通过一些计算或者合并得到的,我们并不需要将它同步到数据库中,就可以通过配置不让它生成到数据库中

    1.1K50

    【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联

    https://blog.csdn.net/huyuyang6688/article/details/50253847   接着上篇文章,唯一外键关联,就是给一对一关联关系中某个对象加一个外键...比如这里给t_person表添加一个外键,指向t_idcard的主键,并且规定t_person中的外键idCard唯一,也可以达到一对一映射的效果。 ?...t_idcard的主键了,而是用标签重新与t_idcard建立了多对一的关系,这样就会在t_person表中生成一个外键关联到t_idcard的主键,并且unique="true..."会对此外键生成唯一约束   建表时生成的sql语句为: drop table if exists t_idCard drop table if exists t_person create table...----   唯一外键关联较主键关联映射的好处就是,万一哪天需求变了,这两个对象的关系由一对一变为多对一,那么直接把外键唯一的约束去掉就行。

    53940

    EF基础知识小记五(一对多、多对多处理)

    本文主要讲EF一对多关系和多对多关系的建立 一、模型设计器 1、一对多关系 右键设计器新增关联 导航属性和外键属性可修改 2、多对多关系 右键设计器新增关联 模型设计完毕之后,根据右键设计器根据模型生成数据库...int not null, [Money] int not null, StudentId int not null ) 添加常规主键约束,代码如下: --单主键约束 alter table...key clustered (Id Asc) 1、一对多(通过外键) --但外键约束(一对多) alter table InfoCard add constraint [FK_InfoCard_Student...] foreign key (StudentId) references Student (Id) on delete no action on update no action 2、多对多(中间表双主键双外键...当你导入表到你的模型时,你将得到两个包含一对多关系的实体,这意味着,你的代码为将来有可能出现的多载荷做好了准备。增加一整型标识列的代价通常很小,但给模型带来了更大的灵活性。

    2.5K80

    MySQL 数据库 增删查改、克隆、外键 等操作

    VALUES(字段1的值,字段2的值,...); 例: #一条一条全字段添加 INSERT INTO USER_INFO(ID,NAME,TYPE,ADD_TIME,IS_USED) VALUES (...,保证数据的完整性和一致性 外键的定义:如果同一个属性字段X 在表一中是主键,而在表二中不是主键,则字段X称为表二的外键。...主键表和外键表的理解: (1)以公共关键字作主键的表为主键表(父表、主表) (2)以公共关键字作外键的表为外键表(从表、外表) 注意: 1. 与外键关联的主表的字段必须设置为主键。 2....ALTER TABLE HOBBY ADD CONSTRAINT PK_HOBID PRIMARY KEY (HOBID); #为从表HOBBY_DETAIL 表添加外键,并将 HOBBY_DETAIL...表的 hobid 字段和 HOBBY 表的 hobid 字段建立外键关联。

    5.9K20

    零基础使用Django2.0.1打造在线教育网站(八):数据库字段的定义(下)

    所以通过分析,我们需要新建4个表,用于信息的存取: [987f98epil.png] c、开始数据库字段的定义 打开我们的courses/models.py文件,添加并修改如下代码: from django.db...,我们在下面添加如下内容: # 章节信息 class Lesson(models.Model): # 前面知道一个课程对应多个章节,所以在章节表中将课程设置为外键。...,所以在视频表中将章节设置为外键。...c、开始数据库字段的定义 打开我们的organization/models.py文件,添加并修改如下代码: from django.db import models from datetime import...# 所以如果使用外键,那么每个消息就要对应一个用户,比较难以实现全员消息的通知。 # 因此我们设置用户id,如果为0就发给所有用户,不为0就是发给特定Id的用户。

    86920
    领券