ASP.NET开发实战——(十三)ASP.NET MVC 与数据库之EF实体类与数据库结构
大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型、长度、是否为空、主外键、索引以及表与表之间的关系。但对于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实体类与数据库结构的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC 与数据库之EF实体类与数据库结构
大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型.长度.是否为空.主外键.索引以及表与表之间的关系.但对于C#编写的类来说,它的属性只有一个数据类型和类与类之间的关系,但是在M ...
- ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM
之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那 ...
- ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF
之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...
- ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...
- ASP.NET开发实战——(二)为什么使用ASP.NET
本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...
- ASP.NET开发实战——(一)开篇-用VS创建一个ASP.NET Web程序
本文是本系列文章第一篇,主要通过建立一个默认ASP.NET MVC项目来引出与ASP.NET MVC相关的功能,由于ASP.NET MVC一个简单的模板就具备了数据库操作.身份验证.输入数据校 ...
- 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 ...
- MVC控制器传递多个实体类集合到视图的方案总结
MVC控制器向视图传递数据包含多个实体类的解决方案有很多,这里主要针对视图模型.动态模型以及Tuple三种方法进行一些总结与记录. 基础集合类:TableA namespace ViewModelSt ...
- ASP.NET开发实战——(五)ASP.NET MVC & 分层
上一篇文章简要说明了MVC所代表的含义并提供了详细的项目及其控制器.视图等内容的创建步骤,最终完成了一个简单ASP.NET MVC程序. 注:MVC与ASP.NET MVC不相等,MVC是一种开发模式 ...
随机推荐
- 构建LVS负载均衡集群——NAT模式(最简单方式)
一.装备一台lvs调度器主机要求两个网卡一个为内部局域网ip,一个为公网ip #IP地址设置过程不再重复 [root@localhost ~]# ip a | grep eth0 #内网ip : et ...
- bzoj3293 分金币
题目链接 problem 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使 得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. so ...
- [译]发布ABP v0.19包含Angular UI选项
发布ABP v0.19包含Angular UI选项 ABP v0.19已发布,包含解决的~90个问题和600+次提交. 新功能 Angular UI 终于,ABP有了一个SPA UI选项,使用最新的A ...
- 美团技术分享:深度解密美团的分布式ID生成算法
本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...
- Swagger UI in AspNetCore WebAPI
Swagger其实包含了三个部分,分别是Swagger Editor文档接口编辑器,根据接口文档生成code的Swagger Codegen,以及生成在线文档的Swagger UI.在AspNetCo ...
- 只想听歌曲的高潮部分?让我用python来教你做个音乐高潮提取器!
有些时候,我们为了设定手机铃声或者发抖音视频时,会耗费大量时间在音乐剪辑上.尤其是想发布大量抖音视频的时候,我们得收集大量的短音乐,这是一个相当耗费时间的工作.那么,这个音乐高潮的提取能不能自动化呢? ...
- centOS服务器添加电脑ssh key以支持远程登陆
1,生成电脑的密钥对(在powershell或cmd命令行中) ssh-keygen -t rsa -C "自己的邮箱" 2.打开刚刚生成的电脑公钥(~即代表用户主目录,/则代表根 ...
- RPM包安装——yum安装
RPM包安装 yum安装 yum源文件解析 yum源文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是".repo",也就是说yum源文件配置只要是扩展名.re ...
- Discuz! X3 数据表、数据字段说明
pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned NO 是 title v ...
- Vue实战狗尾草博客管理平台第六章
Vue实现狗尾草博客后台管理系统第六章 本章节内容 文章列表 文章详情 草稿箱 文章发布. 本章节内容呢,开发的很是随意哈,因为多数就是element-ui的使用,熟悉的童鞋,是可以很快完成本章节的内 ...