第一步,添加EF引用
首先在项目中安装Entity Framework的NuGet包
Install-Package EntityFramework
图示:
第二步,添加实体类
以下实体代码中
[Table("")]
有点多余,英文生成的数据库中会自动为表名加上s
后缀
User实体类:
[Table("Users")]
public class User
{
public Guid Id { get; set; }
[StringLength(12,MinimumLength =2)]
[DisplayName("名字")]
public string Name { get; set; }
public short Age { get; set; }
public DateTime Birthday { get; set; }
[DisplayName("注册日期")]
public DateTime RegDate { get; set; }
[DisplayName("修改日期")]
public DateTime ModifyDate { get; set; }
}
BindAccount实体类
[Table("BindAccounts")]
public class BindAccount
{
public int Id { get; set; }
public string Type { get; set; }
}
Province实体类
public class Province
{
public int Id { get; set; }
public string Name { get; set; }
}
第三步,创建数据库上下文,并配置数据库连接字符串
新建Context类,继承自System.Data.Entity.DbContext
public class Context : DbContext
{
public Context() : base("name=DemoConn")
{
}
public DbSet<User> User { get; set; }
public DbSet<Province> Province { get; set; }
public DbSet<BindAccount> BindAccount { get; set; }
}
配置:
<connectionStrings>
<add name="DemoConn" connectionString="server=.;database=Demo;uid=your account;password=your passsword;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
</connectionStrings>
第四步,添加数据库迁移
打开包管理控制台,输入 enable-migrations
,然后会自动生成一个文件夹:Migrations,然后继续输入:update-database
,会出现以下警告信息:
此时,此时只需要将自动生成的 Migrations\Configuration.cs
中设置AutomaticMigrationsEnabled=true
,如下:
继续在控制台中输入命令:update-database
如下,已成功执行:
此时,生成的数据库和项目结构如下所示:
数据库:
项目结构:
第五步,播种数据
创建数据库初始化器类:SeedingDataInitializer,使用DropCreateDatabaseAlways
数据库初始化策略,代码如下:
public class SeedingDataInitializer : DropCreateDatabaseAlways<Context>
{
protected override void Seed(Context context)
{
for (int i = 0; i < 5; i++)
{
var province = new Province { Name = $"测试省份{i + 1}" };
context.Province.Add(province);
}
base.Seed(context);
}
}
修改数据库上下文 Database.SetInitializer<Context>(new SeedingDataInitializer());
:
public class Context : DbContext
{
public Context() : base("name=DemoConn")
{
Database.SetInitializer<Context>(new SeedingDataInitializer());
}
}
最后在控制台程序的Main方法中,输出结果,代码如下:
class Program
{
static void Main(string[] args)
{
using (var db = new Context())
{
var province = db.Province;
foreach (var p in province)
{
Console.WriteLine($"Id: {p.Id} \t Name{p.Name}");
}
}
Console.WriteLine("数据播种完成");
Console.ReadLine();
}
}
结果图示:
一个问题:为什么使用数据库迁移?
如下,我们Province表中产生5条测试数据,假如我们在开发过程中,添加了一条数据,如下:
目前我们使用策略:DropCreateDatabaseAlways,当我们重新运行程序,发现新增的ID=6的这条记录没了:
但这不是我们想要的结果,我们的期望是保留这条测试数据,我们该怎么做?
这个时候我们就需要数据库迁移了(使用数据库迁移的话就不要使用初始化器了),我们再次手工插入两条记录:
然后在包管理控制台中输入命令:add-migration AddTestDataMigration(你自定义的名称)
,然后在做更新操作:update-database
在Migrations中也自动生成了一些迁移相关的文件: