EF Code-First技能进阶(3)

在前面两篇文章中,给大家讲解了关于EF Code-First的简单使用及进阶配置,那么接下来给大家分享的是关于EF Code-First的进一步讲解。当你掌握这部分内容以后,就能在实际开发中使用EF Code-First了!

温馨提示:本教程提供完整录播视频,请在文章结尾处查看

1.配置数据表之间的对应关系

在设计数据库时,会考虑数据表之间的对应关系,那么在Entity Framework中,通过配置导航属性来配置实体类之间的关系,在生成数据库中,会自动建立数据表之间的关系,常见的关系类型有三种,分别为一对一、一对多、多对多。

在实体类中配置一对一关系

当一个表的主键在关系数据库(如SQL Server)中的另一个表中变为PK&FK时,会发生一对多或一对一的关系。

下述示例将使用实体批注属性来完成和两个实体类间一对一关系的配置,在EF的默认配置中,和将会被默认设置为主键,除此之外,还需要手动配置实体类的外键。

在实体类中包括的导航属性并且在实体类中包括实体类中的导航属性,通过一对一关系,在只添加是实体类而不添加对应的时可成功添加,但是在没有实体类的情况下添加时将会抛出异常。

在实体类中配置一对多关系

下述实例将完成实体类与实体类的一对多对应关系。在Entity Framework中存在一些约定,如果在实体类中遵循这些约定,将会自动完成数据库两表之间的一对多关系。以下是4中具体约定形式

(1)第一种约定

要建立和实体间的一对多关系,在此对应关系中,每个都有一个与之对应。这时可以通过在中添加导航属性来完成。

上述示例中,实体类包含对实体类的导航属性,因此,在一个Class中将会有很多个Student,从而完成了数据库之间的一对多关系,其中 Students表中自动生成了一个外键 Class_ClassId,并且该列可空

(2)第二种约定

第二种约定是在实体类中添加 实体的集合导航属性,该示例如下:

在上述示例中,实体类中使用了一个集合导航属性,从而完成了和实体类间一对多的关系。

(3)第三种约定

在和两个实体中同时包括对方的导航属性也能实现两个实体间的一对多的对应关系,其实现代码如下:

上述示例中,实体类中包括实体类的导航属性,并且实体类中包括集合导航属性,从而完成了一对多的关系。

(4)第四种约定

实体类中添加外键属性可在数据库中的 Students 表中自动生成名为ClassId的外键,其实现代码如下:

在实体类中配置多对多关系

在配置多对多关系的时候,将建立一个名为的实体类,该实体类与实体类将成为多对多的关系,一个Student可以加入多个Course,多个Student可以加入同一个Course。在EF6 Code-First中想实现多对多的关系,需要在两端加入集合属性,其代码实现如下:

通过上述示例,将会在数据库中自动创建Students和Courses表,并且创建了这两个表多对多关系的中间表CourseStudents,该表中包括两个外键和,这两列组合形成主键。

2.配置数据库迁移

Entity Framwork Code-First具有不同的数据库初始化策略,如CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges和DropCreateDatabaseAlways。但是,这些策略存在一些问题,例如,如果数据库中已有数据(种子数据除外)或现有存储过程,触发器等。这些策略用于删除整个数据库并重新创建它,因此将丢失数据和其他数据库对象。

在Entity Framwork中引入了一个迁移工具,可在模型更改时自动更新数据库模式,而不会丢失任何现有的数据或其他数据对象。

要在Entity Framework中完成自动迁移,需要在程序包管理器控制台中执行开启数据库迁移。其操作流程是工具→库包管理器→包管理器控制台打开包管理器控制台,然后运行该命令(确保默认项目是上下文类所在的项目)。

该命令运行成功后,会自动新建一个名为 Magration文件夹并创建一个类,该类派生自。生成的类如下:

完成上述操作后,需要在数据库上下文类中设置数据库自动迁移策略,其实现如下所示:

完成上述配置后,EF将自动处理数据迁移,但是这个迁移仅限于增加或删除实体类,当实体类的属性发生了改变时,将会抛出异常。造成这种情况的原因是丢失了属性相应列中的数据,要处理这种情况时,需要在类的构造函数中添加配置项:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181119G0NY9800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券