大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型、长度、是否为空、主外键、索引以及表与表之间的关系。但对于C#编写的类来说,它的属性只有一个数据类型和类与类之间的关系,但是在My Blog中并没有对它们之间进行过任何的配置,My Blog可以使用已有的数据库运行,在后续为Post类型添加新属性时,新属性也能够正确的添加到数据库表中,以下是MySQL的数据库表结构:

  

  其中IsPublish和ClickCount是后续通过EF Mirgations添加的。下图的表是直接通过EF根据Post类创建的,可以看出它们部分数据类型是不一样的,自己创建的数据库Title等字段用的是varchar而EF创建的是longtext:

  

  本文将从以下两个方面来介绍如何将类与类之间的关系映射到数据库中:

  ●关于EF code first约定
  ●通过Fluent API来修改属性和关系
  ●使用数据特性标记修改属性和关系

关于EF code first约定 

  约定(Conventions)是一个在使用EF Code First时根据实体类型自动配置一个“概念模型”的规则集合,这里的“概念模型”就可以理解为数据库表模型。它们位于System.Data.Entity.ModelConfiguration.Conventions 命名空间。以下是一些常用的约定:
  ● 关于ID的约定(主键约定):类型中以ID命名的或者命名以ID结尾的,如ID或PostID。如果类型为数字或者GUID那么将会被认为是Identity列。
  ● 关于类关系的约定(表之间的外键约定):使用导航属性(既该属性是另一个实体类型)来判断类与类之间的一对一、一对多和多对多关系。

  以下是微软文档例子:

  

  在依赖的类型中建议添加一个外键属性,以下几种写法会被认为是外键属性(大小写不敏感):
  ○ 导航属性名称+主表主键名称
  ○ 主类名称+主键名称
  ○ 主表主键名称

  注:如果外键属性是不可为空类型,那么EF会建立一个关联删除,当主键记录被删除时,关联的外键记录也会被删除。
  如果“导航属性”的类型中不存在主键,那么会被认为是一个复杂类型。
  更多参考文档:
  https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx
  https://msdn.microsoft.com/library/system.data.entity.modelconfiguration.conventions.aspx

通过Fluent API来修改属性和关系

  除了默认的约定外还可以使用特性在对应的实体属性上面标记和通过EF的Fluent API来进行配置实现关系、属性的修改。
  本系列文章以Code First为主,所以对于实体与数据库之间关系的映射也将使用代码的方式通过Fluent API来介绍。
  Code First Fluent API一般是继承DbContext并重写OnModelCreating方法,在OnModelCreating方法中通过modelBuilder来配置对应的实体信息:

  

  ● 添加主键:

  

  ● 设置列属性:

  

  ● 创建索引(EF6.1版本支持)

    

  更多设置参考:https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx
  使用Fluent API处理关系参考:https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx

使用数据特性标记修改属性和关系

  除了使用Fluent API来修改实体与数据库表的映射外,还可以使用数据特性标记的方式实现对类型与数据库表之间的关系和字段属性,但是这样做会对实体代码有入侵,实体代码应该是干净的与EF和数据库属性无关的。

  关于如何使用特性来修改属性和关系可参考文档:https://msdn.microsoft.com/en-us/library/jj591583(v=vs.113).aspx

小结

  本章介绍了实体与数据库结构之间的关系如何处理,并对主要API进行了介绍,但由于目前My Blog中数据库结构比较简单无法完全演示,所以更多使用方法可以参考微软文档。

欢迎添加个人微信号:Like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

ASP.NET开发实战——(十三)ASP.NET MVC 与数据库之EF实体类与数据库结构的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC 与数据库之EF实体类与数据库结构

    大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型.长度.是否为空.主外键.索引以及表与表之间的关系.但对于C#编写的类来说,它的属性只有一个数据类型和类与类之间的关系,但是在M ...

  2. ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM

    之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那 ...

  3. ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF

    之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...

  4. ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations

    在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...

  5. ASP.NET开发实战——(二)为什么使用ASP.NET

    本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...

  6. ASP.NET开发实战——(一)开篇-用VS创建一个ASP.NET Web程序

        本文是本系列文章第一篇,主要通过建立一个默认ASP.NET MVC项目来引出与ASP.NET MVC相关的功能,由于ASP.NET MVC一个简单的模板就具备了数据库操作.身份验证.输入数据校 ...

  7. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  8. MVC控制器传递多个实体类集合到视图的方案总结

    MVC控制器向视图传递数据包含多个实体类的解决方案有很多,这里主要针对视图模型.动态模型以及Tuple三种方法进行一些总结与记录. 基础集合类:TableA namespace ViewModelSt ...

  9. ASP.NET开发实战——(五)ASP.NET MVC & 分层

    上一篇文章简要说明了MVC所代表的含义并提供了详细的项目及其控制器.视图等内容的创建步骤,最终完成了一个简单ASP.NET MVC程序. 注:MVC与ASP.NET MVC不相等,MVC是一种开发模式 ...

随机推荐

  1. 详解C++ STL map 容器

    详解C++ STL map 容器 本篇随笔简单讲解一下\(C++STL\)中的\(map\)容器的使用方法和使用技巧. map容器的概念 \(map\)的英语释义是"地图",但\( ...

  2. Centos7下安装Relion

    目录 1.Virtual Box 1.1下载Virtual Box 1.2安装Virtual Box 2.Centos7 2.1下载Centos7 2.2安装Centos7 2.2.1配置虚拟机 2. ...

  3. .NET Core 中的命名问题:Startup 中的 ConfigureServices 与 Configure

    一直不喜欢 Startup 中这两个可读性很比较差的糟糕命名 ConfigureServices 与 Configure.ConfigureServices 用于配置依赖注入以在运行时根据依赖关系创建 ...

  4. Dubbo 一些你不一定知道但是很好用的功能

    dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能: 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...

  5. gcc 编译安装

    wget https://kojipkgs.fedoraproject.org//packages/gcc/7.1.1/1.module_1a179a7b/src/gcc-7.1.1-1.module ...

  6. jenkins支持git分支发布

    https://blog.csdn.net/wc1695040842/article/details/102228804 核心就是需要安装一个Git Parameter 的插件结合使用. 如果同时有多 ...

  7. SpringCloud的入门学习之Eureka(Eureka的单节点)

    SpringCloud--->Spring生态体系的微服务架构:https://spring.io/ 官网贴图,如下所示,介绍了微服务的架构体系(话说,英语好读官网,可能很爽吧,没体验过). 1 ...

  8. Fiddler 插件开发,使用 WPF 作为 UI 控件

    Fiddler 插件的 UI,本身使用的 WinForm,这个例子是使用 WinForm 中的 WPF 容器,将 WPF 控件作为 Fiddler 插件的 UI 使用. 为什么使用 WPF ?为了自适 ...

  9. PHP-Curl模拟HTTPS请求

     使用PHP-Curl方式模拟HTTPS请求,测试接口传参和返回值状态   上代码!! <?php /** * 模拟post进行url请求 * @param string $url * @par ...

  10. Java生鲜电商平台-高并发核心技术订单与库存实战

    Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安 ...