除了支持 DatabaseFirst 外,EF 还支持 ModelFirst 、 CodeFirst,这两种类型不同于DatabaseFirst 先建立好数据库而后映射 Model , ModelFirst 是通过 Model 映射创建数据库,而 CodeFirst 类似于 ModelFirst, 通过代码逻辑自行创建 Model 并映射数据库,但是不同于 ModelFirst 由 VS 自动创建。
1.ModelFirst
Model先行,通过Model创建数据库
步骤:
- 在新建的项目中,添加 > 新建项 > 数据 > ADO.NET实体数据模型(.edmx)
- 在新建的.edmx中选择:空模型(ModelFirst)
- 在.edmx图形化窗口中,右键 > 新增 > 实体
- 在新增实体页面 填写: 实体名(表名)、是否创建键属性(是否创建主键)、属性名称、属性类型 > 确定
- 在.edmx图形化窗口中,在 实体 上右键 > 新增 > 标量属性(表字段)
- 选中标量属性,按快捷键 F4 或调出属性面板,可以更改标量属性的:类型、名称、长度(必改)
- 在多个实体,且实体之间有关联的时候,在.edmx图形化设计页面中,右键 > 新建 > 关联
- 在添加关联页面设置内容(默认即可)
- 在所有模型创建完毕,在.edmx页面 右键 > 根据模型生成数据库
- 在 “生成数据库 向导” 页面,新建数据库连接 > 设置连接字符串 > 选择需要创建表的数据库 > 点击下一步
- 生成数据库向导中,会生成 DDL(数据库设计语言),并另存为 .sql 文件
- 生成 .sql 文件后,建立的Model并没有映射到数据库引擎中,需要在 .sql 文件中,右键 > 执行,即可。
注意事项:
-
- 新建 标量属性 后,必须在属性面板对 标量属性 的 长度 和 数据类型 进行限制,string长度即为数据库内字段的NVarChar的长度 。
- 在.edmx图形化页面 新建完实体 后,解决方案里面可能没有生成 Model.tt文件(包含Model模型.cs),这时候在.edmx图形化页面: 右键 > 添加代码生成项 > 数据 >EF 版本.x DbContext 生成器 > 确定
关于实体更新 需映射 数据库 更新注意事项:
(1).更新实体后,VS 在生成的DDL数据库脚本中,是把原先创建好的表全部删除,再重新创建更新后的实体所对应的表,如果原数据表中存在数据,数据也会一并删除。
(2). 在更新数据库时一定要谨慎,做好数据库备份,同时如果只是小的改动(扩大字符长度),手动在数据库里 修改即可,或者仅把更新的sql脚本部分拷贝出来,复制到SQL Server执行
2.CodeFirst
先写代码,通过代码创建实体,映射数据库
- 新建项目,在项目里面通过 NuGet程序包 安装EntityFramework(该操作会自动引入EntityFramework以及相对应的命名空间)
-
在配置文件里面添加连接字符串
1 <connectionStrings> 2 <add name="CodeFirstDemo" connectionString="server=.;uid=用户;pwd=密码;database=Test2" providerName="System.Data.SqlClient"/> 3 </connectionStrings>
3. 创建类 .cs ,设置类的属性、类之间的关联


1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace CodeFirstDemo 7 { 8 public class StudentInfo 9 { 10 public int Id { get; set; } 11 public string stuName { get; set; } 12 public DateTime subTime { get; set; } 13 14 //建立联系 15 public virtual ClassInfo classInfo { get; set; } 16 } 17 }


1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 7 namespace CodeFirstDemo 8 { 9 public class ClassInfo 10 { 11 //Id添加主键标识 12 [Key] 13 public int Id { get; set; } 14 15 //数据类型为NVarChar(32),且不可为空 16 [StringLength(32)] 17 [Required] 18 public string clsName { get; set; } 19 20 [Required] 21 public DateTime sbuTime { get; set; } 22 23 //建立联系 24 public virtual ICollection<StudentInfo> sutdentInfo { get; set; } 25 } 26 }
4.创建 EF数据操作类 codeFirstDbcontex,并继承自DbContext


1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Data.Entity; 6 using System.Data.Entity.ModelConfiguration.Conventions; 7 8 9 namespace CodeFirstDemo 10 { 11 public class codeFirstDbcontext:DbContext 12 { 13 //调用父类的构造方法,并传递 配置文件内的 数据库连接字符串 字段 14 public codeFirstDbcontext() : base("name=connStr") { } 15 16 public DbSet<ClassInfo> ClassInfo { get; set; } 17 public DbSet<StudentInfo> Student { get; set; } 18 19 protected override void OnModelCreating(DbModelBuilder modelBuilder) 20 { 21 //实体模型映射成表的时候执行 22 23 //移除 将表名设置为实体类型名称的复数版本的约定 24 //模型名映射在数据库表的时候,可能会出现复数(s) 25 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 26 } 27 } 28 }
5.执行


1 codeFirstDbcontext db = new codeFirstDbcontext(); 2 //如果 数据库中不存在库,则创建 3 db.Database.CreateIfNotExists(); 4 ClassInfo clsInfo = new ClassInfo(); 5 clsInfo.clsName = ".NET班"; 6 clsInfo.sbuTime = DateTime.Now; 7 db.ClassInfo.Add(clsInfo); 8 db.SaveChanges();