EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理

-----------------------------------------------------目录-----------------------------------------------------

EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 (2015-07-13 10:48)

EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理 (2015-07-14 17:50)

-----------------------------------------------------目录-----------------------------------------------------

上节,我们搭建了一个简单的环境,并且通过代码First的方式,生成数据库,创建数据表,同时往数据表中添加记录,查找数据表中的数据,这集我们先来学习获取其中的一条记录,对该记录进行修改,然后删除某一条记录。

首先是获取一条记录,比如获取第一条记录

//获取一条数据
using (var context = new Context())
{
    var savedPeople = context.People;
    if (savedPeople.Any())//如果源序列包含任何元素,则为 true;否则为 false 也就是如果表中有一条记录
    {
       var person = savedPeople.First();//取得第一条
       string name = person.FirstName;//取得数据
    }
}

如果要获取某一条

 var personId = 1;
 var p2 = context.People.Find(personId);//获取要删除的记录 通过主键ID

上面我们既然可以拿到一条数据,那么下面我们就可以修改这条数据了,比如我们要将firstName修改

  //修改一条记录
            using (var context = new Context())
            {
                var savedPeople = context.People;
                if (savedPeople.Any())//如果源序列包含任何元素,则为 true;否则为 false 也就是如果表中有一条记录
                {
                    var person = savedPeople.First();//取得第一条
                    person.FirstName = "www.bamn.cn";//修改名字
                    person.LastName = "Benson";
                    context.SaveChanges();
                }
            }

然后就是删除一条记录了

删除一条记录,其实非常简单的,上面我们已经可以根据ID获取一条记录了,那么要删除这条记录,只需要获取这条交流 然后调用上下文context中的Remove方法就可以删除这条记录了,但是有一条要注意,就是删除了要记得SaveChanges喔。。

    //删除一条记录
using (var context = new Context())
{
     var personId = 2;
    var person = context.People.Find(personId);//获取要删除的记录 通过主键ID
    if (person != null)
    {
       context.People.Remove(person);
       context.SaveChanges();
    }
} 

------------------------------------------------------------------------------

好了,上一拍里面我们基本实现了对数据库的创建 新增 查询 修改 删除,但是我们一直都是只对一张表进行操作,那就是person表,我们的数据结构一直都没有变化,但是这个肯定是不合逻辑的,我们肯定需要其他的表,或者要修改已经有的表,这个时候我们操作发现会报错,首先我们添加一个公司的类

    public class Company
    {
        public int CompanyId { get; set; }
        public string Name { get; set; }
    }

很简单,只有一个主键 和一个名称

然后在上下文context里面添加一个dataset

public DbSet<Company> Companies { get; set; }

这样修改后,当我们运行我们的程序的时候,会报下面的错误

“System.InvalidOperationException”类型的未经处理的异常在 EntityFramework.dll 中发生

其他信息: The model backing the ‘Context‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

这个时候,我们需要使用另外的一种方法来重新构建我们的数据结构

定义一个Initializer类DropCreateDatabaseIfModelChanges<Context>这是一个泛型类

然后重写seed因子方法

protected override void Seed(Context context)
        {
            context.Companies.Add(new Company
            {
                Name = "My company"
            });
        }

在这个方法里面,我们添加一条记录到表了,

这个seed方发挥在执行完本来的操作后才会触发的

当然我们会有更好的方法来处理这个结构改变的问题,我们以后的课程会学习这个问题的...

执行完后,代码不会报异常了,而且也添加了一个新表companies

本集全部代码

#region 第二节课

 //获取一条数据
            //using (var context = new Context())
            //{
            //    var savedPeople = context.People;
            //    if (savedPeople.Any())//如果源序列包含任何元素,则为 true;否则为 false 也就是如果表中有一条记录
            //    {
            //        var person = savedPeople.First();//取得第一条
            //        string name = person.FirstName;//取得数据

            //        var personId = 1;
            //        var p2 = context.People.Find(personId);//获取要删除的记录 通过主键ID
            //    }
            //}

            //修改一条记录
            //using (var context = new Context())
            //{
            //    var savedPeople = context.People;
            //    if (savedPeople.Any())//如果源序列包含任何元素,则为 true;否则为 false 也就是如果表中有一条记录
            //    {
            //        var person = savedPeople.First();//取得第一条
            //        person.FirstName = "www.bamn.cn";//修改名字
            //        person.LastName = "Benson";
            //        context.SaveChanges();
            //    }
            //}

            //删除一条记录
            //using (var context = new Context())
            //{
            //    var personId = 2;
            //    var person = context.People.Find(personId);//获取要删除的记录 通过主键ID
            //    if (person != null)
            //    {
            //        context.People.Remove(person);
            //        context.SaveChanges();
            //    }
            //}
            #endregion

            Database.SetInitializer(new Initializer());//取消数据库架构修改后 

            using (var context = new Context())
            {
               bool res = context.Database.CreateIfNotExists();
               //往数据库中添加数据
               var person = new Person
               {
                   FirstName = "John",
                   LastName = "Doe"
               };
               context.People.Add(person);
               context.SaveChanges();

               //获取数据
               var savedPeople = context.People;
               foreach (var p in savedPeople)
               {
                   Console.WriteLine("Last name:{0},first name:{1},id {2}",
                   p.LastName, p.FirstName, p.PersonId);
               }
            }
            Console.ReadKey();

-------------------------------------------------

好了这集就先说的这里,我们下一集来学习复杂一点的数据结构....

本集代码:http://pan.baidu.com/s/1gd0FxsR

更多EF资料,可以登录本人的主页。。。

感谢大家的阅读....

时间: 2024-12-31 16:36:46

EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理的相关文章

EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性

---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性 (2015-07-22 17:30) EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理 (2015-07-14 17:50) EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 (2015-07-13 10:48)

EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手

----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 ----------------------------目录------------------------------ 网上关于EntityFramework 5.0的教程很多,但是大多数都是代码整理不清晰,有些甚至是拷贝,代码丢失等问题,本人最近也有一个项目是用到EntityFram

使用EntityFrameWork 5.0增删查改(&amp;分页,连表)

   EntityFrameWork 5.0的简单使用 概要: 使用EF增加,删除,编辑以及查询,分页,连表等等 正文: 在项目中添加一下Entiy Data Model: xx.context.tt下的xx.context.cs: 这里的OrderSystemEntities(OrderSystem是数据库名)就是EF的上下文容器对象,继承至DbContext 在OrderSystemEntities中调用DbContext的构造函数DbContext(string connectionNam

GitHub for Windows 2.0使用教程

原文:GitHub for Windows 2.0使用教程 Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法. 一:下载GitHub for Windows 2.0 二:安装GitHub  下载之后点击进行安装过程,安装之后桌面上会有两个图标,分别是  和  . 三:新建项目 GitHub是图形界面模式,Git Shell是命令行模式,在Windows系统下我们使用GitHub进行代码管理. 1:打开GitHub图形界面,输入用户名密码或注册新账号,如下图: 2:登录之

[转载]AngularJS入门教程02:AngularJS模板

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

CRL快速开发框架系列教程四(删除数据)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现影片数据的功能.在进行下步之前,点击“生成应用程序“对应用程序进行编译.右键单击Controllers文件夹,新建一个名为“MoviesController ”的控制器.在创建窗口各选项如下图所示 点击添加,将创建以下文件和文件夹: 项目的 Controllers 文件夹下新增MoviesContr

PAT 字符串-02 删除字符串中的子串

1 /* 2 2 *PAT 字符串-02 删除字符串中的子串 3 3 *2015-08-09 4 4 作者:flx413 5 5 */ 6 7 #include<stdio.h> 8 #include<string.h> 9 10 void fun(char *str, char *substr) { 11 int i, j, k, flag; 12 int len = strlen(substr); 13 14 while(strstr(str, substr)) { //如果字

Yii Framework2.0开发教程(5)数据库mysql性能

继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给予一定的尊重yii2数据库支持引进 Yii 基于 PHP's PDO一个成熟的数据库访问层的建立.它提供了一个统一的 API 并且克服了许多不同的 DBMS 违禁使用. Yii 默认支持下面 DBMS : MySQL MariaDB SQLite PostgreSQL CUBRID: version 9.1.0 or higher. Oracle MSSQL: version 2012 或更高版本号,如需使用 L