大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型、长度、是否为空、主外键、索引以及表与表之间的关系。但对于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列。
  ● 关于类关系的约定(表之间的外键约定):使用导航属性(既该属性是另一个实体类型)来判断类与类之间的一对一、一对多和多对多关系。

  以下是微软文档例子:

 public class Department
{
// 主键
public int DepartmentID { get; set; }
public string Name { get; set; } // 导航属性
public virtual ICollection<Course> Courses { get; set; }
} public class Course
{
// 主键
public int CourseID { get; set; } public string Title { get; set; }
public int Credits { get; set; } // 外键(主表主键名称)
public int DepartmentID { get; set; } // 导航属性
public virtual Department Department { get; set; }
}

  

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

  注:如果外键属性是不可为空类型,那么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中数据库结构比较简单无法完全演示,所以更多使用方法可以参考微软文档。

参考:

  https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx
  https://msdn.microsoft.com/library/system.data.entity.modelconfiguration.conventions.aspx
  https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx
  https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx

本文地址:http://www.cnblogs.com/selimsong/p/7656674.html

ASP.NET没有魔法——目录

ASP.NET没有魔法——ASP.NET MVC 与数据库之EF实体类与数据库结构的更多相关文章

  1. ASP.NET开发实战——(十三)ASP.NET MVC 与数据库之EF实体类与数据库结构

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

  2. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  3. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  4. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  5. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  6. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  7. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  8. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

  9. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理

    ASP.NET没有魔法——ASP.NET MVC Razor与View渲染   对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...

随机推荐

  1. 基于AXI4总线卷积FPGA加速IP核的尝试

    本文先总结不同AXI IP核的实现的方法,性能的对比,性能差异的分析,可能改进的方面.使用的硬件平台是Zedboard. 不同的AXI总线卷积加速模块的概况 这次实现并逐渐优化了三个版本的卷积加速模块 ...

  2. 吐槽下微软的vs code编辑器

    缺点:不能同时打开多个文件夹(打开多个文件夹得先ctrl+shift+N窗口或者除非你的所有项目文件都在同一个文件夹目录下) 优点是支持用户设置以及提供很多插件 // 将设置放入此文件中以覆盖默认设置 ...

  3. MongoDB学习之路(二)

    MongDB特点 MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器的性能. MongoDB旨在为WEB应用提供可拓展的高 ...

  4. 集美大学网络1413第十四次作业成绩(团队九) -- 测试与发布&博客展示(Beta版本)

    题目 团队作业9--测试与发布(Beta版本) 团队作业9成绩  团队/分值 Beta版本测试报告 Beta版本发布说明       总分  Bug类别. 数量 场景测试 测试结果 测试矩阵 出口条件 ...

  5. 201521123082 《Java程序设计》第9周学习总结

    201521123082 <Java程序设计>第9周学习总结 标签(空格分隔):java 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 ...

  6. 201521123049 《JAVA程序设计》 第7周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 //contains()方法 public boolean contains ...

  7. 201521123025 <<java程序设计>>第3周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  8. 201521123030 《Java程序设计》 第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 在fi ...

  9. 聊聊React高阶组件(Higher-Order Components)

    使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...

  10. D3--数据可视化实战总结

    d3理解 标签(空格分隔): 未分类 1.绑定数据 [x] 定义:通过循环的方式将数据绑定在dom元素上,每个数据对应一个元素,所以这个数据的值就能来设定dom元素的width,height,x,y坐 ...