大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型、长度、是否为空、主外键、索引以及表与表之间的关系。但对于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. 向eclipse的JavaWeb项目中导入jar包--备忘录

    一:      在你所需的jar包网站下载对应的jar包.如org.apache.commons.lang.jar. 二:复制粘贴到该JavaWeb的WEB-INF目录下的lib目录下,如: 三:右键 ...

  2. tkinter第一章

    tk1 ------------------------------------------------------------------------------------------ impor ...

  3. js Web存储方式

    JSON是数据交互中最常用的一种数据格式. 由于各种语言的语法都不同,在传递数据时,可以将自己语言中的数组.对象等转换为JSON字符串> 传递之后,可以讲JSON字符串,在解析为JSON对象. ...

  4. 结对编程1-四则运算GUI实现(58、59)

    题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一 ...

  5. [2017BUAA软工助教]收集个人信息

    如题 我们要收集三个东西 1.学号 2.Github地址 ① 3.博客园博客地址 ② 请各位同学自行创建,并按照如下的格式评论在这篇博客下 "14061195+https://github. ...

  6. 201521145《Java程序设计》第2周学习总结

    1. 本章学习总结 掌握了整数类型(byte short int long char),浮点型(float double),布尔型(boolean)的使用,以及它们的包装类Byte Short Int ...

  7. list,set,map总结

    学习了集合,脑子里list,set,map之间的关系有混乱,在这里整理一下.有兴趣的朋友可以看下. 先看下 list,set,map各自的特点

  8. 201521123048 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  9. 201521123109 《java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  10. HTTP请求的header头解析

    Request Headers: 下图是我访问一个URL:http://www.hzau.edu.cn的一个header,根据具体实例来分析一下各部分的功能及其作用. Accept 作用: 浏览器端可 ...