发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
前言
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;
System.Collections.Generic;
System.Linq;
System.Text;
System.Data.Entity;
CodeFirst.Entities;
System.ComponentModel.DataAnnotations.Schema;
System.Data.Entity.ModelConfiguration.Conventions;
namespace
CodeFirst
{
public
class
OrderContext:DbContext
OrderContext()
:
base
(
"CodeFirstDb"
)
Database.SetInitializer<OrderContext>(
new
DropCreateDatabaseIfModelChanges<OrderContext>()
);
}
DbSet<Person> Person
get
;
set
protected
override
void
OnModelCreating(DbModelBuilder modelBuilder)
.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
这些规则都在“System.Data.Entity.ModelConfiguration.Conventions”命名空间下,可以根据实际情况进行选择。一般情况下我们是不需要移除默认约定的,我们更多的时候是要修改丰富这些约定,达到对生成规则的更多细节控制。在EF提供了两种方式进行映射配置:Data Annotations和Fluent API。
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
Entity Framework4.0 (二)概述(EF4 的Model First 方法)
Entity Framework4.0 (二)概述(EF4 的Model First 方法)选中实体中的某一个属性项(如ClassID),然后在属性面板中将其type改为:int32....
【开篇导航】
EF6将作为Entity Framework的下一个重大版本,计划实现基于任务的同步、Code First中的存储过程和函数的支持以及自定义Code First约定。时隔一年,再次写Entity Framework的博文,一来分享这一年来学习...
【日记】118若是你的右眼叫你跌倒,就剜出来丢掉
【日记】118?若是你的右眼叫你跌倒,就剜出来丢掉。Java中实体类和数据库表是相对应的。而多表查询结果涉及到多张表的结果。那如何用一...
Entity Framework Code First (五)Fluent API
例如你想在 Student 和 Address 两个实体间建立 one-to-one 关系,而且只在 Address 实体上包含导航属性,此时你就需要用 Code First Fluent API 配置这种关系// Map one-to-one relationshipmodelBuil...
大型数据库
大型数据库2010~2011学年下学期08级 班大型数据库系统设计实验题目 学号: 姓名: 产品信息数据库有3个表,产品表product、订单表order和订单详细表orderDeta...
hibernate注解
hibernate注解第 2 章 实体Bean2.1. 简介。由于Hibernate引入了 @org.hibernate.annotations.NamedQuery,@org.hibernate.annotations.NamedQueries,@org.hibernate.annotations.NamedNativeQuery 和 @o...
JPA标注
Table Table用来定义entity主表的name,catalog,schema等属性。代码 @JoinTable( table=@Table(name=CUST_PHONE), joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName=&q...
Oracle(PLSQL)入门学习五
create table user3(id number(3) ,name varchar2(20) ,age number(3) not null,constraint pk_user3_id primary key (id),constraint uq_user3_name unique (name))create table user3(id number(3) ,...
JPA注解详解(五)
当实体或子类上发生生命周期事件时,JPA 持续性提供程序将按监听程序定义的顺序通知每个实体监听程序,并调用使用相应的生命周期事件类型进行批注的实体监听程序方法(如果有)。实体监听程序类具有以...
微信扫码,在手机上查看选中内容