Entity Framework 学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Entity Framework 学习笔记相关的知识,希望对你有一定的参考价值。
Entity Framework最主要的东西,就是自己创建的、继承于DbContext的类:
/// <summary> /// Context相当于一个数据库 /// </summary> public class MusicContext : DbContext { //base("LocalDB")表示要用到config文件中的名为“LcoalDB”的连接字符串 public MusicContext() : base("LocalDB") { } //DbSet相当于数据表 public DbSet<Album> Albums { get; set; } }
当然,我们的数据表定义类也很简单,如下:
/// <summary> /// 专辑 /// </summary> public class Album { public int AlbumId { get; set; } public string Title { get; set; } public decimal Price { get; set; } }
对应的实际数据表定义为:
可以很容易看到,int和decimal都很正常,string被翻译为nvarchar(MAX)
很多时候我们并不需要让一个纯文本字段定义到nvarchar(MAX),大多数用的是一个实际的值,比如nvarchar(50)。
想在Entity Framework中去这样实现,就得给字段加入特性(Attribute):
/// <summary> /// 专辑(Table表示要为创建的数据表手动设置表名称) /// </summary> [Table(name: "MyTable")] public class Album { public int AlbumId { get; set; } /// <summary> /// StringLength可以设定最大长度 /// </summary> [StringLength(50)] public string Title { get; set; } [Required] public decimal Price { get; set; } }
这时如果我们运行程序,就会报错:
意思就是说:你程序中的表定义和数据库中的表定义不一致(肯定不一致啊,我们都改定义了)
这个时候,我们就需要进行一组操作,将程序中的表定义,同步到数据库中去:
- 打开Package Manager Console
- 输入Enable-Migrations,开启数据库迁移
(如果项目中有多个DbContext对象,则这里会报错,相应的解决方法就是指定DbContext的类的包括命名空间的全名:Enable-Migrations –ContextTypeName 全名)(如果要让Entity Framework帮你自动将改动实施到目标数据库,则可以再添加一个选项 –EnableAutomaticMigrations,所以这个例子中比较好的写法就是:Enable-Migrations –ContextTypeName NormalTest.MusicContext –EnableAutomaticMigrations) - 图中的内容表示已经创建数据库迁移组件,Entity Framework在项目中添加了一些文件,可以在Solution Explorer中看到
- 这个时候呢,我们就可以继续输入指令Update-Database将目标数据库进行更新(这里可以使用Update-Database –Scirpt选项来显示运行了哪些改动)。不过呢…又报错
意思是我们没有开启–EnableAutomaticMigrations这个选项。这里我们有两个方法来开启,一个是直接输入Enable-Migrations -EnableAutomaticMigrations -Force;另一个则是打开Entity Framework为我们刚刚创建好的Configuration.cs文件
把AutomaticMigrationsEnabled = false这个值改成true。 - 开启这个选项,我们再次输入Update-Database,还是报错
这个错误是说,你将要进行的改动会对你目前的数据造成损失,所以我们没有你的授权就不干!好吧,既然你没授权,我们就给你授权!
授权的方式有两种,一个是使用Update-Database –Force来强行进行修改;另一个则是在刚才的Configuration.cs文件中再添加一句base.AutomaticMigrationDataLossAllowed = true;
Main方法中,如果调用MusicContext来创建实例,那么Entity Framework就会根据连接字符串去找对应的数据库。
- 如果数据库不存在,则根据数据表描述类来创建数据库
- 如果已经创建好的数据库中的表定义和程序中的对应的类定义不一致,则删除对应的表,再根据程序中的类定义去重新创建数据表
Entity Framework工作的基础就是,类定义和实际数据库情况必须一致,否则就会抛异常报错
以上是关于Entity Framework 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
Entity Framework的学习(ASP.NET MVC5的学习中的一部分)