博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework 系统约定配置
阅读量:6406 次
发布时间:2019-06-23

本文共 2358 字,大约阅读时间需要 7 分钟。

原文:

前言

Code First之所以能够让开发人员以一种更加高效、灵活的方式进行数据操作有一个重要的原因在于它的约定配置。现在软件开发越来越复杂,大家都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定。对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计。使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有。在EF中是以一种约定的方式进行表、列同实体类进行映射的,与此同时为了提高最大的灵活性EF中可以通过Fluent API和Data Annotations两种方式对映射进行灵活配置。

Entity Framework 默认约定

1.将数据类的类名复数形式作为数据表名称,并且使用“dbo”作为默认架构。

  例如定义一个Person数据类,那么将会自动生成“dbo.Persons”表。

2.将数据类中的“ID”属性或者“<类名>+ID”作为主键(不区分大小写),并且如果该列为数值类型或者GUID列将作为标识列。

  例如在Order类中如果有ID或者OrderID属性将默认作为主键,二者均出现优先使用 “ID”属性。

3.使用导航属性约束两个表之间的关系,在从表数据类中除了导航属性,推荐定义一个外键属性在从表数据类中(如果不指定将默认生成一个“<主表类名>+<主表类的主键名>”的外键列;此外在主表中推荐定义一个集合从表属性用户导航,当然这个属性不定义也可以正常生成外键关系但是不利于使用),具体规则:“<导航属性名>+<主表的主键属性名>”或者“<主表类名>+<主键属性名>”又或者“<主表的主键属性名>”,其属性名不区分大小写并且如果出现多种匹配按照先后顺序匹配;如果不存在外键属性则外键关系注册为可选的,否则注册为必选项并且此时将设置级联删除关系;如果在从表类中有多个导航属性对应同一个数据类那么需要使用fluent API或者Data Annotations进行手动配置。

  例如有一个Order类,主键为OrderID,在OrderDetail类中有一个导航属性Order(Order类型),那么当你定义一个OrderID在OrderDetail中,那么在Order和OrderDetail直接将建立一个级联删除关系。

4.当EF按照上述规则在数据类中没有找到主键属性时(或者通过fluent API、Data Annotations没有定义)将认为此类为“复杂类型”。

  例如在“Person”数据类中有一个“Name”属性,但是数据库中可能将“Name”分为FirstName和LastName存储,此时就可以定义一个Name类,在此类中不定义主键列定义“FirstName”和“LastName”属性,就会在表“dbo.People”中生成“Name_FirstName”和“Name_LastName”列。

Entity Framework 手动定义约定

 EF的默认约定不是一成不变的,我们可以选择移除和修改它,例如EF默认生成数据表时将数据类名的复数形式作为表名,下面的代码就可以移除这个规则:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.Entity;using CodeFirst.Entities;using System.ComponentModel.DataAnnotations.Schema;using System.Data.Entity.ModelConfiguration.Conventions;namespace CodeFirst{    public class OrderContext:DbContext    {        public OrderContext()            : base("CodeFirstDb")        {            Database.SetInitializer
( new DropCreateDatabaseIfModelChanges
() ); } public DbSet
Person { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove
(); } }}

 这些规则都在“System.Data.Entity.ModelConfiguration.Conventions”命名空间下,可以根据实际情况进行选择。

一般情况下我们是不需要移除默认约定的,我们更多的时候是要修改丰富这些约定,达到对生成规则的更多细节控制。在EF提供了两种方式进行映射配置:Data Annotations和Fluent API。

转载地址:http://gkqea.baihongyu.com/

你可能感兴趣的文章
openssl升级
查看>>
第4章章节测试
查看>>
TurboMail邮件系统捍卫涉密信息安全
查看>>
修改myBatis Generator源码
查看>>
Linux中可用的网页音乐播放器
查看>>
Hadoop入门(3)_统计单词在文件中出现的个数
查看>>
IOS7.X完美越狱解决被安装太极助手的方法
查看>>
Single Writer Principle
查看>>
我的友情链接
查看>>
探索Google App Engine背后的奥秘(5)- Datastore的设计(转载)
查看>>
linux系统启动流程
查看>>
[转]Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络...
查看>>
我的友情链接
查看>>
安装配置管理 之 apt+synaptic 为Fedora core 4.0 中安装Nvida芯片显示卡及Ati 卡显示驱动...
查看>>
将密码加密
查看>>
JAVA学习笔记-sort
查看>>
程序员逼格提升完全指南
查看>>
YunTable开发日记(2) – 前三天的总结 (转载)
查看>>
bboss会话共享架构
查看>>
Target runtime Apache Tomcat v7.0 is not defined.
查看>>