EF CodeFirst简介、默认约定、数据库初始化策略

CodeFirst 工作流程

创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库。

CodeFirst默认约定

约定就是一系列的默认规则,通过这些规则,在使用EF Code-First的时候,可以自动的基于你的领域类配置概念模型。默认约定的命名空间:System.Data.Entity.ModelConfiguration.Conventions;

①schema(模式)  默认情况下,EF会为所有的数据库对象,创建dbo模式名称。

注:dbo--database owner 数据库所有者,当你在数据库新建对象时,默认所有者为当前登录账号,当用其他账号登录时,必须指定  所有者.对象  才能调用,为了避免麻烦可以将对象的所有者指定为dbo,这样不管谁调用,使用dbo.对象就可以了。

②Table Name(表名)  EF默认为实体类创建的表名为实体类+s,如Person类的表名:Persons

③Primary Key Name(主键名)  EF默认将Id属性或实体名+Id(不区分大小写)设置为主键。

④Foreign Key Name(外键名)

Person类主键为Id,有一个Student类型的属性S,Student主键为StuId

EF会首先查找Person类中有无StuId属性,有的话设为外键,没有的话,会在数据库中创建外键:Student_StuId

⑤NULL column(可空列)  EF会为所有引用类型的属性(不包含主键)创建可空数据列。

⑥Not NULL column(不可空列)  EF为主键属性和不为空的值类型创建非空列。

⑦DB Column Order(数据列顺序)  EF会根据属性在实体中的顺序,为列创建相应的顺序。需要注意的是:主键列会被移到第一个

注意的是:EF 6 不包含一对一和多对多的关系约定。你可以通过数据注解或者Fluent API来配置一对一关系或者多对多关系。

数据库初始化策略

CreateDatabaseIfNotExists:这是默认的数据库初始化策略。就像它的名称那样,如果根据配置,数据库不存在的话,就会创建数据库。但是如果你改变模型类,使用这个策略,再运行程序的话,就会抛出一个异常。

DropCreateDatabaseIfModelChanges:这个策略会在你的模型发生改变的时候,删除已经存在的数据库,然后创建一个新的数据库。所以当你模型改变的时候,不必担心怎么来维护数据库对象模式。

DropCreateDatabaseAlways:就像其名称所示,这个策略每次你运行程序的时候,都会删除以及存在的数据库,而不管你的模型类 是否发生改变。这个策略非常有用,当你每次运行程序,都想要一个新的数据库的时候。例如:当你在开发程序的时候。使用这个策略比较好。

Custom DB Initializer: 如果上面的策略不满足你的需求或者数据库初始化的时候,你想额外做一些其他的处理的时候, 你就可以创建你自己的数据库初始化策略。

你如果想使用自定义的数据库初始化策略,就可以继承上面三个中的其中一个策略,例如:

原文地址:https://www.cnblogs.com/1016391912pm/p/12047011.html

时间: 2024-11-05 12:14:57

EF CodeFirst简介、默认约定、数据库初始化策略的相关文章

EF Code-First 学习之旅 数据库初始化

Context类的基类构造函数有如下的参数 1.无参数 如果没有给基类构造函数添加参数,它会在local SQLEXPRESS server创建数据库,名为{Namespace}.{Context class name} namespace SchoolDataLayer { public class Context: DbContext { public Context(): base() { } } } 上面创建的数据库名称为:SchoolDataLayer.Context 2.参数为:数据

Code-First 数据库初始化策略

原文:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 有四种不同的数据库初始化策略: CreateDatabaseIfNotExists:这是默认的初始值设定项.顾名思义,如果每个配置都不存在,它将创建数据库.但是,如果更改模型类,然后使用此初始化程序运行应用程序,则会引发异常. DropCreateDatabaseIfModelChange

【译】第31节---数据库初始化策略

原文:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 在第一次运行Code-First应用程序后已经创建了一个数据库,但是第二次启动时呢?每次运行应用程序时会创建一个新的数据库吗?生产环境怎么样?更改域模型时,如何更改数据库?要处理这些情况,必须使用一个数据库初始化策略. 有四种不同的数据库初始化策略: CreateDatabaseIfNot

DB Initialization(数据库初始化)[EF Code-First系列]

前面的例子中,我们已经看到了Code-First自动为我们创建数据库的例子. 这里我们将要学习的是,当初始化的时候,Code-First是怎么决定数据库的名字和服务的呢??? 下面的图,解释了这一切!!! 这个图解释了,数据库初始化的流程,是基于我们在上下文类中的构造函数中传递的参数. 在上面的图中,context类中的base构造器中,可以填入下面的参数: 无参数(No Parameter) 数据库的名字(Database Name) 连接字符串的名字(Connection String Na

Code-First 约定(EF Code-First系列)

前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的领域类,然后根据默认的规矩来配置概念模型.Code-First约定定义在这个命名空间下面: System.Data.Entity.ModelConfiguration.Conventions 现在来大致浏览一下都有哪些约定吧: 类型发现 在前面的章节中,我们在上下文类中创建了DbSet属性的类集合,

EF CodeFirst 数据库创建与迁移

一.EF CodeFirst 根据实体创建数据库 1.新建好实体类 2.添加数据库上下文的类StudentInfoEntities:继承DbContext 3.配置Web.Config连接数据库字符串(name=“数据库上下文类的名称”) 4.写个controller运行代码,自动生成数据库 二.迁移数据库(sqlserver) 当修改实体属性后需要迁移数据库:打开工具-->NuGet程序包管理器-->程序包管理器控制台 1.第一次迁移先执行命令:Enable-Migrations 2.Add

1.Relationship in Entity Framework Using Code First Approach With Fluent API【使用EF Code-First方式和Fluent API来探讨EF中的关系】

In this article, you will learn about relationships in Entity Framework using the Code First Approach with Fluent API. 在这篇文章中,你将会学习到使用EF Code-First方式和Fluent API来探讨EF中的关系(一对一,一对多,多对多). Introduction[介绍] A relationship, in the context of databases, is a

EF codefirst 数据库迁移

如果出现 未能加载文件或程序集“Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 重新安装EF 命令Install-Package EntityFramework 在此之后 主要是3步走: 1:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbC

EF 创建数据库的策略 codefist加快效率!【not oringin!】

今天去搜寻,ef创建数据库的策略有四种,区分还是和数据库里sql的创建的语句这些英文差不多一致. 一:数据库不存在时重新创建数据库 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<