上一篇《【EntityFramework系列】入门干货》,介绍了Entity Framework的入门基础内容,今天手把手一步步的带你创建一个Entity Framework工程玩玩。
在VS中,创建控制台应用EntityFrameworkDemo。
“工具——NuGet包管理器——管理解决方案的NuGet程序包”,搜索entityframework,勾选上一步创建的EntityFrameworkDemo项目,点击安装。(或者在“程序包管理器控制台”输入“Install-Package EntityFramework”命令,回车安装)。
在项目的app.config配置文件中,添加数据库连接字符串配置项,并正确配置数据库连接字符串。
<connectionStrings>
<add name="Test" connectionString="Data Source=DESKTOP-GAV5DS7;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=123456" providerName="System.Data.SqlClient" />
</connectionStrings>
创建EDM实体数据模型。
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public DateTime BirthDay { get; set; }
}
创建数据库上下文类。
public class TestContext : DbContext
{
public TestContext():base("Test"){ }
public DbSet<User> Users { get; set; }
}
说明:数据库上下文类继承自DbContext,上一讲中有提到构造函数传数据库连接字符串的配置。DbSet<User>表示数据库中的表。集合中的每一个实体对象,代表表中的每一行数据。此时表的名称默认为上下文类中属性的名称“Users”。
通过EF的API创建数据库
创建数据库的方式主要有两种:数据迁移、API。此处先介绍API方式。
public static void Main(string[] args)
{
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
}
Console.Write("数据库创建完成!");
Console.Read();
}
最后,确保app.config中配置的数据库连接字符串正确,就可以运行程序了,等命令行输出“数据库创建完成!”即可。然后打开数据库,就可以看到已创建的Test数据库(数据库名在连接字符串中),以及新建的Users表。
同时,EF会创建一个名为“__MigrationHistory”的表。此表是用来记录数据迁移的,以后介绍数据迁移时,进行说明。
注意:EF默认将UserId作为了主键,代码中的string类型对应成了nvarchar(max),这些是EF的命名规范以及约定。
简单的CRUD操作
此处介绍CRUD操作,只涉及Main函数代码的修改,修改后请自己运行程序,查看操作效果等。
1、Create操作
public static void Main(string[] args)
{
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
var users = new List<User>
{
new User
{
Name = "路人甲",
BirthDay = new DateTime(2000, 1, 1)
},
new User
{
Name = "路人乙",
BirthDay = new DateTime(2001, 2, 2)
},
new User
{
Name = "路人丙",
BirthDay = new DateTime(2002, 3, 3)
}
};
context.Users.AddRange(users);
context.SaveChanges();
}
Console.Write("数据添加完成!");
Console.Read();
}
2、Retrieve操作
public static void Main(string[] args)
{
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
var userList = context.Users;
Console.WriteLine("Id\t\t姓名\t\t出生日期");
foreach (var user in userList)
{
Console.WriteLine("{0}\t\t{1}\t\t{2}", user.UserId, user.Name, user.BirthDay.ToShortDateString());
}
}
}
注意:EF的懒加载。
3、Update操作
public static void Main(string[] args)
{
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
var userList = context.Users;
if (userList.Any())
{
var toBeUpdated= userList.First(d => d.Name == "路人乙");
toBeUpdated.Name = "路人。乙";
context.SaveChanges();
}
}
}
4、Delete操作
public static void Main(string[] args)
{
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
var toBeDeleted = context.Users.Single(d => d.Name == "路人丙");
if (toBeDeleted != null)
{
context.Users.Remove(toBeDeleted);
context.SaveChanges();
}
}
}
加一张表
添加表的操作方法有数据库迁移、更改数据库模式等。此处介绍通过更改数据库模式来进行添加,数据库迁移的相关内容,在后面单独介绍。
比如添加一个省份表Provinces。按照上面的步骤进行添加,代码如下:
public class Province
{
public int ProvinceId { get; set; }
public string ProvinceName { get; set; }
}
在数据库上下文TestContext类中添加以下属性:
public DbSet<Province> Provinces { get; set; }
此时,运行程序,循环枚举省份,将会报错。因为数据库上下文与现在的数据库结构不匹配。为了解决这个问题,我们通过初始化器,来更改数据库模式。
1、创建初始化器Initializer。
public class Initializer : DropCreateDatabaseIfModelChanges<TestContext> { }
2、使用该初始化器。
public static void Main(string[] args)
{
Database.SetInitializer(new Initializer());
using (var context = new TestContext())
{
//如果数据库不存在时则创建
context.Database.CreateIfNotExists();
var provinceList = context.Provinces;
provinceList.ToList();
}
}
注意:因为上面的初始化器会销毁之前的数据库,所以之前累积的所有数据也都会丢失。很显然,这种用法不适合生产环境,但是我们学习EF或者项目早期是很方便的。以上代码中,最后一行调用ToList方法,原因也是因为EF的懒加载。
3、初始化器的其他功能
初始化器允许我们在目标数据库创建之后运行其他代码,可以通过重写Seed方法即可,比如添加原始数据。
public class Initializer : DropCreateDatabaseIfModelChanges<TestContext>
{
protected override voidSeed(TestContext context)
{
context.Provinces.AddRange(new List<Province>
{
new Province{ ProvinceName="北京"},
new Province{ ProvinceName="天津"},
new Province{ ProvinceName="河北"}
});
}
}
Entity Framework的简单示例就介绍到这里。
下期预告:【EntityFramework系列】入门湿货(二)管理实体关系示例。