我的EF学习笔记是按照汪鹏(⽹名Jeffcky)⼤侠《你必须掌握的Entity Framework 6.x与Core 2.0》来弄的。
这也是我第⼀篇博客,感觉这东西不能乱写啊,算了,⼲吧。
EF我之前是做过的,但是只是⼀些零碎的东西,不成系统。
EF是什么呢?ORM框架object renational mapping 对象关系映射,下⾯我就⽤⾃⼰的话来了。
数据库⾥⾯存放数据⽤表,⽽我们程序代码使⽤类,⼀个是数据世界的弄法,⼀个是对象世界的弄法。EF就是为我们做这种对象映射的处理,让我可以不⽤关⼼数据库,只关系类怎么设计就⾏了。
我说完了。它主要就是这个对吧,当然会有其他的很多东西,通过程序直接创建数据库,然后更多的精⼒放到了类上,业务逻辑上,突然多出来的精⼒没处使,是不是就弄出了什么领域驱动设计?
现在来创建⼀个控制台程序,安装EF,打开程序包管理控制台输⼊命令:install-package entityframework
创建Blog类,写⼀个EFDbContext类,这个类派⽣⾃DbContext,为blog公开⼀个DbSet属性
然后在main⽅法⾥⾯实例化上下⽂对象,添加⼀个blog实例,接着查询这个实例,打印出来
幼儿园老师教师节祝福语然后控制台⼤概过了⼗多秒,看到了刚刚添加的数据,那么简单的创建数据库、表就完了~
namespace _20190105
{
public class Blog
{
public int ID { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public DateTime? CreatedTime { get; set; }
public double Double { get; set; }
public float Float { get; set; }
}
}
namespace _20190105
{
// 此上下⽂是与数据库交互的⼀个中间桥梁,可以称之为会话,为每⼀个模型公开⼀个DbSet<>,定义DbSet有三种⽅式
public class EFDbContext:DbContext
{
// DbSet 三种设计⽅式,不太懂,我随便弄了⼀种
//public DbSet<Blog> Blog { get; set; }
//public IDbSet<Blog> Blog { get; set; }
public DbSet<Blog> Blog {
get { return Set<Blog>(); }
米的妈妈是谁}
}
}
namespace _20190105
{
class Program
{
static void Main(string[] args)
{
/
/ 上下⽂实例化,添加⼀个blog实例
using (EFDbContext db = new EFDbContext())
{
db.Blog.Add(new Blog
{
CreatedTime = DateTime.Now,
Double = 11.11,
Float = 2.2f,
ID = 1,
Name = "第er篇博客",
Url = "localhost:8080"金箔画制作
});
db.SaveChanges();
Console.WriteLine(JsonConvert.SerializeObject(db.Blog.ToList()));
}
}李念丈夫
}
}
来看看数据库,对照着模型看⼀下,数据库和表是什么样⼦的。这⾥要注意⼀点,如果是按照上⾯的⼏步操作,EF默认会给我们把数据库创建到localdb⾥⾯
localdb是个什么玩意,他也是个数据库,但是这和我们SQL server数据库管理⼯具创建的数据库有什么不⼀样呢?⽹上说这个localdb完全是为了针对开发⼈员使⽤的,⼀个数据库最⼤容量为10G,那他到底是在安装VS的时候安装的,还是在装SQLserver安装的呢?
要查看刚刚创建的数据库,在VS上点击“视图”-->"SQL server数据库对象资源管理器",也可以通过SQL server去连接它
通过SQL server管理⼯具连接到这个localdb,有可能你的机器上没有安装这个localdb,我这个没有刻意去安装,反正就是有这个东西
⾸先,数据库创建在localdb⾥⾯,数据库的名称是我们项⽬命名空间+上下⽂类名
然后我们看表名,我们的DbSet<>属性是Blog,但是在数据库⾥⾯表明成了Blogs,变成复数形式了
然后我们看字段,ID默认给我弄成了主键,并且设置为⾃增长
string类型对应nvarchar(max),并且允许为空
double类型对应float
float类型对应real
datetime?可空类型对应datetime,可空
刚刚我添加⼀个条数据,ID为1,现在我⼜添加⼀个blog实例,ID还是1,但是没有报错,正确插⼊进
去了,ID⾃增长为2
然后我在Blog中添加⼀个字段Test,再次运⾏,报错
他说模型放⽣了改变,让我⽤codefirst 迁移来更新数据库
⾏,然后我在程序包管理器控制台输⼊ add-migration jinshantest,报错
No migrations configuration type was found in the assembly '20190105'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).
他说没有在程序集中发现迁移配置类型,可以使⽤enable-migrations添加配置
就是说要⽤这个迁移,要先执⾏ enable-migrations 命令来开启⼀下迁移,这些命令不区分⼤⼩写
我执⾏了命令:enable-migrations 发现我的项⽬中被创建了⼀个Migrations⽂件夹,⾥⾯有两个⽂件
但是我并没有看到刚刚添加的那个Test属性,先不管,我们直接更新看看
输⼊命令:update-database
然后他说没有挂起的显⽰迁移,什么意思,不就是说没什么可以更新的吗?
然后我再次⽣成⼀个新的迁移类⽂件,输⼊命令:add-magration jinshantest 这个jinshantest就是你为这个迁移⽂件取的⼀个名字
现在就有了。
那么现在就更新到数据库⾥⾯吧,现在我们再来执⾏迁移:update-database -verbose 加上-verbose就是显⽰迁移的详细信息
可以看到它根据迁移⽂件的内容,⽣成了创建列的SQL语句,并更新到了数据库
我现在⼜想到,我再添加⼀个字段“Test2”并且设置为⾮空,看看它能不能给我更新到数据库,更新之后是什么样⼦,这需求很正常吧
改动了模型就要做数据迁移,继续add-migration jinshantest2 ⽣成迁移⽂件
李冰冰个人资料可以的,他⽣成的SQL语句是下⾯这样的。
ALTER TABLE [dbo].[Blogs] ADD [Test2] [nvarchar](max) NOT NULL DEFAULT ''
现在我想要EF⾯向我的SQL server ⽽不是localDB
那么我需要在fig⽂件中加上数据库连接字符串的配置,他要其他的我也不会去配,因为Code-first不就是不⽤到处配东西,直接写代码就⾏吗? Initial Catlog=TestDB,这个TestDB在我数据库⾥⾯不存在,我当然不会弄⼀个已存在的数据库,我的⽬的就是要让它给我创建数据库
然后修改我们的Dbcontext⽂件,告诉EF我们的数据库连接字符串
于是我运⾏程序,报错了:不到对象“dbo.Blogs”
我检查我的的SQL server ⾥⾯什么都没有。
陈数主演的电视剧难道是因为我Main⽅法⾥有做数据持久化的代码,他在插⼊数据的时候不到表,就报错了?
刚刚在localDB⾥⾯不是好好的吗?在对localDB操作的时候,我什么都没做,他⾃动给我创建数据库,创建表
难道我现在还要在SQL server中创建⼀个数据库然后创建⼀个表?那要你做什么?
⾏,我弄了下,⼤概知道了,我要先做数据迁移才⾏,就是把刚刚的那些迁移⽂件现在针对我的SQL server执⾏,于是命令⾏输⼊:update-database -verbose
⾏了,数据库和表都有了。
SQLserver 和localDB就是这⼀点区别,localDB不⽤先迁移。
后⾯还有其他的很多配置,不过总算是能够简单地创建数据库和表了,并且修改model后,我们利⽤数据迁移对数据库做更新,还是⽐较完整吧。
书中的内容都是⼀点点讲起的,数据迁移在后⾯才会讲到。书有⽬录啊,必须跟着⽬录⾛啊。我⾃⼰随便弄,还是觉得要⽤⼀个完整的东西把这些散碎的东西串起来好⼀些。
发布评论