简单使用 Entity Framework Code First
2019-03-05 本文已影响1人
迷糊先生_57ad
-
.ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。是微软的一个ORM框架。
-
为什么使用 Code First
开发新应用程序时,数据模型会频繁更改。每当模型更改时,模型都无法与数据库保持同步。 你已配置实体框架会自动删除并重新创建每次更改数据模型的数据库。 当添加、 删除或更改实体类或更改你DbContext类,在下次运行应用程序时自动删除您现有的数据库,创建一个新的匹配该模型,并使用测试数据为其设定种子。当在生产环境中运行应用程序时,它通常会存储你想要保留,并且不想丢失所有每次进行一次更改如添加新列的数据通过启用 Code First 来更新数据库架构而不是删除并重新创建数据库 -
安装 Entity Framework 6
- 从工具菜单中,选择NuGet 包管理器,然后选择程序包管理器控制台。
- 在中程序包管理器控制台窗口中,输入以下命令:
Install-Package EntityFramework
- 创建数据模型
- 实体创建
public class Student
{
/// <summary>
/// ID 属性将成为对应于此类的数据库表中的主键
/// </summary>
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
/// <summary>
/// Gender 是枚举,问号后Grade类型声明指示Grade属性是空
/// 表示一个等级未知或者尚未分配。
/// </summary>
public Gender? Gender{ get; set; }
/// <summary>
/// Enrollments 属性是导航属性,导航属性中包含与此实体相关的其他实体
/// 导航属性通常定义为virtual
/// </summary>
public virtual ICollection<Enrollment> Enrollments { get; set; }
//如果导航属性可以具有多个实体 (如多对多或一对多关系),那么导航属性的类型必须是可以添加、 删除和更新条目的容器,如 ICollection。
}
- 创建数据库上下文
/// <summary>
/// 必须要继承DbContext此类
/// </summary>
public class SchoolContext : DbContext
{
/// <summary>
/// 连接字符串 (它稍后将添加到 .config 文件) 的名称被传递给构造函数
/// 使用 Code First 与 app.config/web.config 文件中的连接字符串
/// </summary>
public SchoolContext() : base("SchoolContext")
{
}
//DbContext 知道要加载现有模型 (而不是使用 Code First 计算从代码) 的连接字符串是包含要使用的模型的详细信息的 EF 连接字符串
//public SchoolContext() : base("name=SchoolContext")
//{
//}
//设置初始化数据库
//当第一次使用dbContext派生类的实例时,此接口的实现用于初始化基础数据库。此初始化可以有条件地
//创建数据库和/或为其输入数据。所使用的策略是使用数据库类的静态初始化策略属性设置的
static SchoolContext() {
//一:数据库不存在时重新创建数据库[默认]
Database.SetInitializer(new CreateDatabaseIfNotExists<SchoolContext>());
//二:每次启动应用程序时创建数据库
//Database.SetInitializer<SchoolContext>(new DropCreateDatabaseAlways<SchoolContext>());
//三:策略三:模型更改时重新创建数据库
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SchoolContext>());
//策略四:从不创建数据库
//Database.SetInitializer<SchoolContext>(null);
}
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
/// <summary>
/// 阻止表名正在变为复数形式
/// </summary>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
- 启用 Code First 迁移
- 从“工具”菜单中,选择“NuGet 包管理器” > “包管理器控制台”。
- 在PM>提示符处输入以下命令:
//命令创建迁移文件夹的项目,在该文件夹中放入Configuration.cs可编辑以配置 Migrations 的文件
// Configuration类 Seed 方法 插入或更新后 Code First 创建或更新数据库测试数据。 创建数据库和每次更新数据库架构时,数据模型更改后调用方法,Seed方法运行每次执行update-database命令
enable-migrations
// 创建测试数据
//protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
//{
// var students = new List<Student>
// {
// new Student { FirstMidName = "Carson", LastName = "Alexander",
// EnrollmentDate = DateTime.Parse("2010-09-01") },
// ......
// }
// students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
// context.SaveChanges();
//}
//迁移生成的代码 在名为的文件*<时间戳>_InitialCreate.cs*。 Up方法InitialCreate类创建与数据模型实体集相对应的数据库表和Down方法中删除它们
add-migration InitialCreate
- update-database
//update-database命令将运行Up方法来创建数据库,然后将它运行Seed方法来填充该数据库
update-database
//查看应用于目标数据库的SQL语句
Update-Database -Verbose
//数据库版本回溯
Update-Database –TargetMigration:"迁移代码文件名称"