上期回顾:Entity Framework 学习笔记(1)


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):

需要添加两个命名空间:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

        /// <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; }
}

这时如果我们运行程序,就会报错

意思就是说:你程序中的表定义和数据库中的表定义不一致(肯定不一致啊,我们都改定义了)

这个时候,我们就需要进行一组操作,将程序中的表定义,同步到数据库中去

  1. 打开Package Manager Console

  2. 输入Enable-Migrations,开启数据库迁移

    (如果项目中有多个DbContext对象,则这里会报错,相应的解决方法就是指定DbContext的类的包括命名空间的全名:Enable-Migrations –ContextTypeName 全名)
    (如果要让Entity Framework帮你自动将改动实施到目标数据库,则可以再添加一个选项 –EnableAutomaticMigrations,所以这个例子中比较好的写法就是:Enable-Migrations –ContextTypeName NormalTest.MusicContext –EnableAutomaticMigrations)
  3. 图中的内容表示已经创建数据库迁移组件,Entity Framework在项目中添加了一些文件,可以在Solution Explorer中看到
  4. 这个时候呢,我们就可以继续输入指令Update-Database将目标数据库进行更新(这里可以使用Update-Database –Scirpt选项来显示运行了哪些改动)。不过呢…又报错

    意思是我们没有开启–EnableAutomaticMigrations这个选项。这里我们有两个方法来开启,一个是直接输入Enable-Migrations -EnableAutomaticMigrations -Force;另一个则是打开Entity Framework为我们刚刚创建好的Configuration.cs文件

    把AutomaticMigrationsEnabled = false这个值改成true。
  5. 开启这个选项,我们再次输入Update-Database,还是报错

    这个错误是说,你将要进行的改动会对你目前的数据造成损失(把无限长的字符串把长度变为50肯定会造成损失),所以我们没有你的授权就不干!好吧,既然你没授权,我们就给你授权!
    授权的方式有两种,一个是使用Update-Database –Force来强行进行修改;另一个则是在刚才的Configuration.cs文件中再添加一句base.AutomaticMigrationDataLossAllowed = true;
  6. 好了,让我们再执行一次Update-Database

    大功告成!
  7. 让我们打开数据库表定义看看

    表名变成了MyTable,并且Title字段有了最长限定

以上就是使用Entity Framework的Code First模式所进行的数据库更新,虽然繁琐,但是毕竟就是这么一个流程

PS.如果我们在最后更新数据库的时候,输入Update-Database –Script,VS会自动打开一个SQL编辑窗口,里面有自动升成的更新脚本,当然这个时候脚本还没有执行呢!!还得手动执行一次!!

Entity Framework 学习笔记(2)的更多相关文章

  1. Entity Framework学习笔记

    原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总   之前的小项目做完了,到了总结经验和 ...

  2. ADO.NET Entity Framework学习笔记(3)ObjectContext

    ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转]   说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ...

  3. Entity Framework学习笔记——错误汇总

    之前的小项目做完了,到了总结经验和更新学习笔记的时间了.开始正题之前先啰嗦一下,对之前的学习目标进行一个调整:“根据代码生成表”与“生成数据库脚本和变更脚本”合并为“Code First模式日常使用篇 ...

  4. Entity Framework学习笔记——记一个错误解决方式及思路

    继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...

  5. Entity Framework学习笔记——配置EF

    初次使用Entity Framework(以下简称EF),为了避免很快忘记,决定开日志记录学习过程和遇到的问题.因为项目比较小,只会用到EF的一些基本功能,因此先在此处制定一个学习目标:1. 配置EF ...

  6. Entity Framework学习笔记(四)----Linq查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...

  7. Entity Framework学习笔记(三)----CRUD(2)

    请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...

  8. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

  9. Entity Framework学习笔记(一)

    请注明转载地址:http://www.cnblogs.com/arhat 哈哈!老魏回来了,4月份的内容开始更新了,由于3月份时间都在做项目,没有时间写了,那么4月份老魏会尽可能的多写点东西的.那么4 ...

随机推荐

  1. 利用Chrome模拟访问移动端网页

    很多网站都通过User-Agent来判断浏览器类型,如果是3G手机,显示手机页面内容,如果是普通浏览器,显示普通网页内容. 谷歌Chrome浏览器,可以很方便地用来当3G手机模拟器.在Windows的 ...

  2. 【32】确定你的public继承塑模出Is-A关系

    1.public继承表示Is-A关系,也就是满足里氏代换.与之相对应的,private继承表示根据某物实现出,不满足里氏代换.子类对象初始化父类引用,编译通不过. 2.考虑下面的需求,企鹅继承鸟,Bi ...

  3. Java下拼接运行动态SQL语句

    mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有       1.使用动态语句 非常多数 ...

  4. [Bootstap] 9. Dropdown

    Dropdown Arrow Class In order to create a down arrow like this: , what class should we apply to the ...

  5. iOS开发——UI篇OC篇&不规则排列的图片布局

    不规则排列的图片布局 一直在500px上看照片,发照片.以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下.昨天不知怎么的就开始想其中的算法了,现在我把思考的过程在这里贴出来分 ...

  6. sphinx配置文件继承

    # # Minimal Sphinx configuration sample (clean, simple, functional) # source mysql { type = mysql #数 ...

  7. android的进度条使用

    android的进度条 1.实现的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding= ...

  8. 【面试题】如何让C语言自动发现泄漏的内存

    1. 题目 改造malloc和free函数,使C语言能自动发现泄漏的内存,在程序退出时打印中遗漏的内存地址和大小. 2. 思路 用一个链表来记录已经分配的内存地址.在malloc时,把分配的内存地址和 ...

  9. Java + MongoDB Hello World Example--转载

    原文地址:http://www.mkyong.com/mongodb/java-mongodb-hello-world-example/ A simple Java + MongoDB hello w ...

  10. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...