Code-First和我们的数据库优先方式是相反的,数据库优先是通过数据库映射出相应的类和上下文,Code-First测试通过创建的类和上下文得到相应的数据库。
Code-First主要用于领域驱动设计。使用Code-First方法,您可以专注于域设计,并根据您的域要求开始创建类,而不是先设计数据库,然后创建与您的数据库设计相匹配的类。Code-First API将根据您的实体类和配置实时创建数据库。对于程序员而言这样方便了很多,我们可以把注意力集中在代码上面而不用去管数据库。
基本的工作流程将是:
①编写应用程序域类和上下文类
②配置域类以获得额外的映射需求
③按F5运行应用程序
④Code First API创建新数据库或使用域类映射现有数据库
⑤将种子默认/测试数据插入数据库
⑥最后启动应用程序
例如:
新建一个控制台,安装EF框架,准备做测试。
①创建相关的类,一个类对应数据库的一张表
②创建上下文
③配置文件
④F5运行,运行成功会在数据库中自动创建数据库和表
默认规则集:
按照规则做了就会达到相应的目的。
例如:
① 类型约定: 上下文中使用DbSet<TEntity>类型属性,或者在DbSet类的里面存在引用类型,而没有出现在上下文中,会在数据库中创建表
② 主键约定:
属性名称是Id或<类名> Id(不区分大小写),则EF会为属性创建主键。主键属性的数据类型可以是任何内容,但是如果是数字或GUID,那么它将被配置为数据库中的标识列。
如果您已经定义了除Id或<ClassName> Id以外的关键属性,则将抛出ModelValidationException。
注意:每个实体类必须在实体框架中包含关键属性。
③关系约定
EF 6默认使用导航属性来推断一对多关系。
注意: EF 6不包括一对一和多对多关系的默认约定。您需要使用Fluent API或DataAnnotation进行配置。我们在后面会详细介绍。
④外键约定
我们已经在上面看到Code First在遇到导航属性时会自动插入一个外键。建议在关系的依赖端包含一个外键属性。
约定:
数据库初始化: 第一个例子就是利用链接字符串来初始化的
上下文类的基础构造函数可以具有以下参数。
- 没有参数
- 数据库名称
- 连接字符串名称
没有参数
如果您没有在上下文类的基础构造函数中指定参数,那么它将在本地SQLEXPRESS服务器中创建一个名称与您的{Namespace}。{Context class name}匹配的数据库。例如,Code First将为以下上下文类创建一个名为SchoolDataLayer.Context的数据库: (因为我这边没有安装SQL express所以演示不了)
数据库名称: