1 1.学习资料地址:
2 CodeFirst:https://msdn.microsoft.com/zh-cn/data/jj193542
3
4 一.CodeFirst迁移(Migration)
5 1.工具-->Nuget程序包管理器-->程序管理包控制台
6 `在程序包管理器控制台中运行Enable-Migrations(启用迁移)命令 (将这些更改应用于数据库)
7 一个新的 Migrations 文件夹已添加至项目中,它包含两个文件:
8 Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,
9 但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
10
11 <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客
12 和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。
13 Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序
14 2.更改模型:在控制台运行 Add-Migration AddCategorySort命令 (语法:Add-Migration 迁移名称)
15 Add-Migration 命令检查自上次迁移后是否有更改,并使用所有更改搭建新迁移。我们可以为迁移指定名称;
16
17 3.更新数据库:在控制台执行 Update-Database命令 (将新迁移应用于数据库)
18 此命令将所有挂起的迁移应用于数据库。InitialCreate 迁移已经应用,因此,这些迁移将仅应用新的 AddUrl 迁移。
19 提示:在调用 Update-Database 命令查看对数据库执行的 SQL 时,可以使用 –Verbose 开关。
20 注意:迁移数据库前必须将数据库上下文所在的类设置为启动项目,并且该项目下的配置文件里面有连接字符串
21
22 二.到目前为止,EF 发现了使用其默认约定的模型。但是,有时类不遵从约定,我们需要能够执行进一步配置。
23 对此有两种方法:1:数据注释,2.Fluent API。
24 (1):数据注释
25 数据注释特性介绍地址 https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations(v=vs.100).aspx
26
27 1.KeyAttribute:表示一个或多个用于唯一标识实体的属性。
28 示例:
29 [Key]设置该属性为主键
30 public string Id { get; set; }
31 2.StringLengthAttribute:指定数据字段中允许的最小和最大字符长度
32 示例:
33 [StringLength(maximumLength:250,MinimumLength =150)] 设置该属性允许的最大字符串长度为250和最小字符串长度150
34 public string Name { get; set; }
35 3.MaxLengthAttribute 指定属性中允许的数组或字符串数据的最大长度。
36 示例:
37 [MaxLength(200)]
38 public string PassWord { get; set; }
39 4.ConcurrencyCheckAttribute:指定某属性将参与开放式并发检查。
40 示例:
41 [ConcurrencyCheck] 一般用于控制并发
42 public string OrderId { get; set; }
43 5.RequiredAttribute :指定需要数据字段值。
44 示例:
45 [Required] 一般用不为空
46 public string Name { get; set; }
47 6.TimestampAttribute:将列的数据类型指定为行版本。
48 7.ComplexTypeAttribute:表示该类是复杂类型。 复杂类型是实体类型的非标量属性,实体类型允许在实体内组织标量属性。 复杂类型没有键,并且实体框架不能脱离父对象来管理复杂类型。
49 8.ColumnAttribute:表示数据库列属性映射。 需要引入using System.ComponentModel.DataAnnotations.Schema;命名空间
50 示例:
51 [Column(name:"CreateTime")]
52 public DateTime CreateDate { get; set; }
53 9.TableAttribute:指定类将映射到的数据库表。
54 示例:
55 [Table(name:"UserInfo")] 指定表的名称
56 public class User
57 10.InversePropertyAttribute:指定表示同一关系的另一端的导航属性的反向属性。
58 11.ForeignKeyAttribute:表示关系中用作外键的属性。 注释在外键属性。属性导航可能会放置和指定关联导航属性名称或者放置并指定与外键名称。
59 示例:
60 [ForeignKey("RoleId")]
61 public string RoleId { get; set; }
62 12.DatabaseGeneratedAttribute:指定数据库生成属性值的方式。
63 示例:
64 [DatabaseGenerated(databaseGeneratedOption: DatabaseGeneratedOption.Identity)] 定义主键生成的方式
65 public int Id { get; set; }
66 13.NotMappedAttribute:表示应从数据库映射中排除属性或类。
67 示例:
68 [NotMapped](该字段不会映射到数据库的列)
69 public int Sort { get; set; }
70
71 (2)Fluent API:
Fluent API:
//Fluent API:要访问 Fluent API,需要在 DbContext 中重写 OnModelCreating 方法
将用户模型User中列CreateDate属性名映射为CurrCreateDate的数据库列
1.重写OnModelCreating方法,并添加如下代码。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
//将User表中CreateDate列名映射为CurrCreateDate
modelBuilder.Entity<User>().Property(u => u.CreateDate).HasColumnName("CurrCreateDate");
base.OnModelCreating(modelBuilder);
}
2.使用 Add-Migration ChangeDisplayName 命令搭建迁移,将这些更改应用于数据库。
3.运行 Update-Database 命令,将新迁移应用于数据库。
CodeFirst共有两种方式迁移:1.基于代码的迁移、2.自动迁移
基于代码的迁移:vs-->工具-->Nuget程序包管理器-->程序管理包控制台-->Enable-Migrations-->更改实体模型-->Add-Migrations 名称-->Update-Database
自动迁移:vs-->工具-->Nuget程序包管理器-->程序管理包控制台-->Enable-Migrations –EnableAutomaticMigrations -->更改实体模型-->Update-Database
注意:借助自动迁移功能,您无需对您所做的每一个更改都在项目中配备一个代码文件,就可使用 Code First 迁移。并不是所有更改都能自动应用,举例来说,重命名列就需要基于代码进行迁移。