ORM(二):EF的ModelFirst、CodeFirst

除了支持 DatabaseFirst 外,EF 还支持 ModelFirst 、 CodeFirst,这两种类型不同于DatabaseFirst 先建立好数据库而后映射 Model , ModelFirst 是通过 Model 映射创建数据库,而 CodeFirst 类似于 ModelFirst, 通过代码逻辑自行创建 Model 并映射数据库,但是不同于 ModelFirst 由 VS 自动创建。

1.ModelFirst

Model先行,通过Model创建数据库

步骤:

  1. 在新建的项目中,添加 > 新建项 > 数据 > ADO.NET实体数据模型(.edmx)
  2. 在新建的.edmx中选择:空模型(ModelFirst)
  3. 在.edmx图形化窗口中,右键 > 新增 > 实体
  4. 在新增实体页面 填写: 实体名(表名)、是否创建键属性(是否创建主键)、属性名称、属性类型 > 确定
  5. 在.edmx图形化窗口中,在 实体 上右键 > 新增 > 标量属性(表字段)
  6. 选中标量属性,按快捷键 F4 或调出属性面板,可以更改标量属性的:类型、名称、长度(必改
  7. 在多个实体,且实体之间有关联的时候,在.edmx图形化设计页面中,右键 > 新建 > 关联
  8. 在添加关联页面设置内容(默认即可)
  9. 在所有模型创建完毕,在.edmx页面 右键 > 根据模型生成数据库
  10. 在 “生成数据库 向导” 页面,新建数据库连接 > 设置连接字符串 > 选择需要创建表的数据库 > 点击下一步
  11. 生成数据库向导中,会生成 DDL(数据库设计语言),并另存为 .sql 文件
  12. 生成 .sql 文件后,建立的Model并没有映射到数据库引擎中,需要在 .sql 文件中,右键 > 执行,即可。
    ModelFirst.jpg

注意事项:

    1. 新建 标量属性 后,必须在属性面板对 标量属性 的 长度 和 数据类型 进行限制,string长度即为数据库内字段的NVarChar的长度 。
    2. 在.edmx图形化页面 新建完实体 后,解决方案里面可能没有生成 Model.tt文件(包含Model模型.cs),这时候在.edmx图形化页面: 右键 > 添加代码生成项 > 数据 >EF 版本.x DbContext 生成器 > 确定

关于实体更新 需映射 数据库 更新注意事项:
(1).更新实体后,VS 在生成的DDL数据库脚本中,是把原先创建好的表全部删除,再重新创建更新后的实体所对应的表,如果原数据表中存在数据,数据也会一并删除。

(2). 在更新数据库时一定要谨慎,做好数据库备份,同时如果只是小的改动(扩大字符长度),手动在数据库里 修改即可,或者仅把更新的sql脚本部分拷贝出来,复制到SQL Server执行


2.CodeFirst

先写代码,通过代码创建实体,映射数据库

  1. 新建项目,在项目里面通过 NuGet程序包 安装EntityFramework(该操作会自动引入EntityFramework以及相对应的命名空间)
  2. 在配置文件里面添加连接字符串

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 }
studentInfo.cs
 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 }
ClassInfo.cs

  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 }
codeFirstDbcontext

  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();
执行

codeFirst.jpg

 

猜你喜欢

转载自www.cnblogs.com/ruisenlLi/p/9267026.html