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
时间: 2024-10-13 00:00:41

EF Code-First 学习之旅 Code First Conventions的相关文章

EF Code First学习笔记 初识Code First

Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来了解. 建立一个控制台项目.通过Nuget来获取Entity Framework. 增加两个模型类: public class Destination { public int DestinationId { get; set; } public string Name { get; set; }

EF Code First学习笔记

EF Code First学习笔记 初识Code First EF Code First 学习笔记:约定配置 Entity Framework 复杂类型 Entity Framework 数据生成选项DatabaseGenerated Entity Framework 并发处理 EF Code First 学习笔记:关系 Entity Framework Code First级联删除 EF Code First 学习笔记:表映射 EF Code First学习笔记:数据库创建 Entity Fr

Entity Framework Code First学习系列

Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012,在数据库方面Entity Framework Code First在Entity Framework 5.0仅支持MS SQL Server数据库.在接下来的随笔中,均使用项目名称为Portal的控制台应用程序为例.具体的系统学习目

Entity Framework 实体框架的形成之旅--Code First的框架设计(5)

在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好,也可以利用图形化的设计器来设计表之间的关系,是开发项目较多采用的模式,不过问题还是这个XML太过复杂,因此有时候也想利用Code First模式构建整个框架.本文主要介绍利用Code First 来构建整个框架的过程以及碰到的问题探讨. 1.基于SqlServer的Code First模式 为了快速

EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段

VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段.在保存实体时会出现错误. 可以通过修改Mapping.tt解决. 打开Mapping.tt,找到 foreach (var prop in efHost.EntityType.Properties) { var type = (PrimitiveType)prop.TypeUsage.EdmType; var isKey = efHost.EntityTy

EF框架step by step(8)—Code First DataAnnotations(2)

上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体之间的关系. ForeignKey Code first默认情况下会自动建立实体之间的关系,比如在EF框架step by step(3)—Code-First这篇随笔中所介绍那样. public partial class BlogUser{ public int BlogUserId { get;

EF框架step by step(7)—Code First DataAnnotations(2)

上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体之间的关系. ForeignKey Code first默认情况下会自动建立实体之间的关系,比如在EF框架step by step(3)—Code-First这篇随笔中所介绍那样. public partial class BlogUser{ public int BlogUserId { get;

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1

Objective-C学习之旅 第三篇

Objective-C学习之旅 第三篇 Objective-C 类声明,定义,实例,初始化 类声明 //类声明的编译处理指令以@interface开始,以@end结尾,在这之间代码便是类变量的定义和方法的声明. //类的声明和定义比其他语言复杂,这会让刚开始学习Objective-C的人非常困惑 //准确的说,其他语言如Java只需定义类而不用声明,而Objective-C需要先声明再定义. @interface 类名 : 父类名 { 声明成员变量 ... } 声明方法 @end 实例: @in