EF Code-First 学习之旅 Code First Conventions
协定是一系列的默认规则用来自动配置领域中的概念模型
1:类型发现
Code-First对包含DBSet属性的类型创建表(包括这些类型的所有引用类型)
public class Student
{
public Student()
{ }
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; } public Teacher Teacher { get; set; } public Standard Standard { get; set; }
} public class Teacher
{
public Teacher()
{ }
public int TeacherId { get; set; }
public string TeacherName { get; set; }
}
namespace EF_Code_First_Tutorials
{ public class SchoolContext: DbContext
{
public SchoolContext(): base()
{ } public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; } }
}

上图所示:即使上下文不包含Teacher的实体集,Code-First也为Teacher创建表
Code-First发现类型的协定:
1)上下文中的DBSet属性类型
2)引用的类型,即使在不同程序集中
3)DBSet属性的子类
主键约定
默认是:属性名是Id或者是类名+id的属性作为主键
主键的类型可以是任何类型,如果主键的数据类型为数字或者是GUID,则被配置为标识列
如果定义主键为其他名字,则会抛出ModelValidationException 异常
public class Standard
{
public Standard()
{ }
public int StdId { get; set; }
public string StandardName { get; set; } public IList<Student> Students { get; set; } }
Standard定义StdId为主键,EntityFramework会抛出异常
'System.Data.Entity.ModelConfiguration.ModelValidationException' occurred in EntityFramework.dll
EntityType 'Standard' has no key defined. Define the key for this EntityType.
如果要定义StdId为主键,则需要DataAnnotations or Fluent API来配置主键
关系约定
Code First推断两个实体之间的关系用到导航属性
导航属性可以是简单的引用类型或集合
例如在Student中的导航属性为Standard,Standard中的导航属性为ICollection<Student>
因此,Code First自动为Standard和Student建立一对多的关系
在Student表中建立名为Standard_StandardId 的外键
public class Student
{
public Student()
{ }
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; } //Navigation property
public Standard Standard { get; set; }
} public class Standard
{
public Standard()
{ }
public int StandardId { get; set; }
public string StandardName { get; set; } //Collection navigation property
public IList<Student> Students { get; set; } }

因此,Code First默认约定外键的名字为:<导航属性名>_<导航属性的主键>
外键约定
public class Student
{
public Student()
{ }
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; } //Foreign key for Standard
public int StandardId { get; set; } public Standard Standard { get; set; }
} public class Standard
{
public Standard()
{ }
public int StandardId { get; set; }
public string StandardName { get; set; } public IList<Student> Students { get; set; } }
上面的例子中,Student类包含外键StandardId(Standard类的主键),Code First将在Students表中创建StandardId列名代替Standard_StandardId列

上面的外键不可为null,因为int类型不是nullable
如果定义为nullable,则可为null
复杂类型约定
Code-First默认的约定
| Default Convention For | Description |
|---|---|
| Table Name | <实体类名> + 's' EF will create DB table with entity class name suffixed by 's' |
| Primary key Name | 1) Id 2) <实体类名> + "Id" (忽略大小写) EF will create primary key column for the property named Id or <Entity Class Name> + "Id" (case insensitive) |
| Foreign key property Name | By default EF will look for foreign key property with the same name as principal entity primary key name. If foreign key property does not exists then EF will create FK column in Db table with <Dependent Navigation Property Name> + "_" + <Principal Entity Primary Key Property Name> e.g. EF will create Standard_StandardId foreign key column into Students table if Student entity does not contain foreignkey property for Standard where Standard contains StandardId |
| Null column | 所有的引用类型列为null,基类型属性为nullable |
| Not Null Column | 主键属性为notnull,non-nullable |
| DB Columns order | 表中的列排序与实体中的属性排序是一样的,不过主键会被移到首位 |
| Properties mapping to DB | 所有的属性都被映射到列中,使用[NotMapped]特性排除属性或列不进行映射 |
| Cascade delete | Enabled By default for all types of relationships. |
C#中的数据类型与表中的数据类型对应关系
| C# DataType | Related DB Column DataType | PK Column DataType & Length |
|---|---|---|
| int | int | int, Identity column increment by 1 |
| string | nvarchar(Max) | nvarchar(128) |
| decimal | decimal(18,2) | decimal(18,2) |
| float | real | real |
| byte[] | varbinary(Max) | varbinary(128) |
| datetime | datetime | datetime |
| bool | bit | bit |
| byte | tinyint | tinyint |
| short | smallint | smallint |
| long | bigint | bigint |
| double | float | float |
| char | No mapping | No mapping |
| sbyte | No mapping (throws exception) |
No mapping |
| object | No mapping | No mapping |
EF Code-First 学习之旅 Code First Conventions的更多相关文章
- EF Code First学习笔记 初识Code First
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF Code First学习笔记 初识Code First(转)
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF Code First学习笔记
EF Code First学习笔记 初识Code First EF Code First 学习笔记:约定配置 Entity Framework 复杂类型 Entity Framework 数据生成选项 ...
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- Entity Framework Code First学习系列
Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...
- Entity Framework 实体框架的形成之旅--Code First的框架设计(5)
在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好, ...
- EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段
VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段.在保存实体时会出现错误. 可以通过修改Mapping.tt ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
随机推荐
- Jqurey实现相似EasyUI的页面布局
截图例如以下:(可通过移动中间蓝色的条.来改变左右两边div的宽度) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ21pbmd4aW5nOTgw ...
- Tomcat设置maxPostSize导致Post请求不过去
问题:最近部署项目,用到的Tomcat 版本:7.0.82.0,发现一直登陆不了,查询发现原来前端的数据传递不到后端 排查问题:通过debug日志发现,后端没有接受到前端用户的登陆数据,检查发现Tom ...
- VS2008试用版到期解决办法----win7下VS2008升级补丁.zip
打开好久没用的Visual studio 2008,才知道试用版已经到期了.在网上找来了序列号,可是连一个输入序列号的地方都没有,困惑了好久,终于找到了解决办法. 首先献上自己收集的Visual st ...
- C#设计模式-单实例
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 1.经典的模式 namespace singleClass { class ...
- MySQL中锁问题
1.脏读 脏页只是在缓冲池中已经修改的页但是没有刷新到磁盘中,即数据库实例内存中的页和磁盘中的页事不一致的,当然在刷新到磁盘之前,日志都已经被写入到了重做日志文件中,而所谓的脏数据是指事务对缓冲池中行 ...
- Hadoop “Name node is in safe mode” 错误解决方法
Hadoop 解除 "Name node is in safe mode" 运行hadoop程序时,有时候会报以下错误:org.apache.hadoop.dfs.SafeMode ...
- 自定义gradle plugin
最近开始接触gradle 正好有个需求apidoc
- redis性能测试以及影响性能的因素
redis-benchmark测试工具的命令使使用方法及参数如下:redis-benchmark [-h <host>] [-p <port>] [-c <clients ...
- 由于Redis漏洞导致服务器被黑
原文地址 漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Re ...
- 3.6中的range()
在python3中range()是这样的: >>> range(4) range(0, 4) #额,列表跑哪去了 在之前的python2中是这样的: >>> ran ...