01-Entity FrameWork如何控制数据的变化

在Entity Framework所有操作数据就是更新EF容器中的实体状态

 public enum EntityState
    {
        Added = 4,
        Deleted = 8,
        Detached = 1,
        Modified = 0x10,
        Unchanged = 2
    }

 1、新增

    StudentAddress address = new StudentAddress
            {
                Address = "地址" + DateTime.Now
            };
            db.StudentAddress.Add(address);
            Console.WriteLine(db.Entry<StudentAddress>(address).State);//added
            db.SaveChanges();

调用Add方法,实际上就是将实体状态改为added,然后通过saveChanges()保存到数据库

  StudentAddress address = new StudentAddress
            {
                Address = "地址" + DateTime.Now
            };

            db.Entry<StudentAddress>(address).State = System.Data.Entity.EntityState.Added;
            db.SaveChanges();

2、编辑

  --第一种方法:

            var address2 = db.StudentAddress.FirstOrDefault();
            address2.Address = "ModifyFromEf2";//Modified
            db.SaveChanges();

-- 1、与实体字段的值作比较,如果值不变,则不会产生update-sql语句
-- 2、修改了某个字段值,update sql语句只会set 修改某个字段,不会修改全部字段
-- 3、查询2次数据库

--第二种方法:

   StudentAddress address = new StudentAddress
            {
                Id = 36,
                Address = "update地址"
            };

            //1、追加到EF容器中,状态为Detached
            var entityEntry = db.Entry(address);//Detached
            entityEntry.State = System.Data.Entity.EntityState.Modified;
            db.SaveChanges();

--1、将一个游离的实体 追加到 EF 容器中

-- 2、将EF实体状态改为Modified

-- 3、修改所有的字段,无论是否变化

--第三种方法(综合前两种修改方法):

--查询1次数据库

--修改指定的字段

   //1、追加到EF容器中,状态为Detached
            var entityEntry = db.Entry(address);//Detached
            Console.WriteLine("追加到EF容器:" + entityEntry.State);

            //2、修改指定字段Unchanged-->指定字段为修改
            db.StudentAddress.Attach(address);//相当于entry.State = System.Data.EntityState.Unchanged;
            Console.WriteLine("Attach-Unchanged:" + entityEntry.State); //Unchanged  

            entityEntry.Property("Address").IsModified = true;
            Console.WriteLine("修改后状态:" + entityEntry.State); //Modified 

            db.SaveChanges();

3、删除亦是如此

      StudentAddress address = new StudentAddress
            {
                Id = 36,
                Address = "u222pdate地址" + DateTime.Now
            };
            db.StudentAddress.Attach(address);//Detached

            db.StudentAddress.Remove(address);//或将其状态修改为:EntityState.Deleted;
            db.SaveChanges();

4、源码

--每一种数据的变化,都会有相应的集合来保存这些实体的变化

如:ObjectStateManager

Dictionary<EntityKey, EntityEntry> _addedEntityStore
Dictionary<EntityKey, EntityEntry> _deletedEntityStore
Dictionary<EntityKey, EntityEntry> _unchangedEntityStore
Dictionary<EntityKey, EntityEntry> _modifiedEntityStore

--当实体变化发生改变时候,调用AddEntityEntryToDictionary,插入到集合中

--调用saveChange(),就会去获取这些变化,进行操作数据

时间: 2024-10-21 05:58:25

01-Entity FrameWork如何控制数据的变化的相关文章

LINQ TO SQL和Entity Framework 的关系 你了解多少?

1. LINQ  TO SQL 和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist  Code Frist    ModeL  Frist   三种中方式 来进行和数据库之间的访问.只是形式不同而已本质没有什么区别.都是ORM  之间的转化.最终都是来进行访问底层的数据库的对象 和服务. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开发设计的,LinQ 可以让他们以一种面向数

Entity Framework 6 Recipes 2nd Edition(9-3)译-&gt;找出Web API中发生了什么变化

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6  获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 假设你有如图8-7所示的模型.你正在离线环境下工作,你想应用在获取客户端修改之前,使用Where从句和FirstDefault()方法从数据库中获取原始对象. 图8-7.包含一个单独实体Item的模型 按代码清单8-9的方式,在获取实体之后,使用新值更新实体并将其保存到数据库中. 代码清单8-9. 获取最新

Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段

在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntityState字段状态来保存数据变化. 文本参考了如下两篇文章: https://msdn.microsoft.com/en-us/data/jj592676 https://stackoverflow.com/questions/30987806/dbset-attachentity-vs-dbconte

Entity Framework基础01

学习了ADO.NET的相关知识,掌握了它对数据库表的基本操作,但是实际在开发项目应用中微软为我们开发ef这个ORM,使用它可以很方便的利用ADO.NET来操作DBMS,使得我们开发项目的着重点放在业务逻辑层上面,从而轻数据库的设计. 一:Entity Framework 1 解释   *ef说白了就是对ADO.NET的包装,它可以将数据库中的数据变成实体的模型,也可以将模型变成为数据库中的表,很是方便.   *ef里面重要的就是数据上下文.它是生成数据查询语句的关键.结果实际返回的是IQuery

Entity Framework 6 Recipes 2nd Edition(9-4)译-&gt;Web API 的客户端实现修改跟踪

9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Code First方式实现对数据的访问. 本例,我们模拟一个N层场景,用单独的控制台应用程序作为客户端,调用Web API服务(web api项目). 注:每个层用一个单独的解决方案,这样有助于调试和模拟N层应用. 解决方案 假设我们一个如Figure 9-4.所示模型 Figure 9-4. A 客户

【译著】Code First :使用Entity. Framework编程(3)

第三章 对属性使用约定和配置 在第2章,对Code First的约定以及如何通过配置覆写默认约定行为进行了大致的介绍.学习了如何使用Data Annotations进行配置,也学习了如何使用Fluent API作出相同的配置,并对两者进行了对比. 在本章乃至以后几章里,将深入各种用于配置模型的领域.对每个主题会看到Code First如何通过默认规则进行工作,也会学到如何通过Data Annotations和Fluent API来覆写这些规则.前已指出,在Fluent API中可以实现的很多配置

Entity Framework Code First (三)Data Annotations

Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表示 EF 所依赖的模型去执行查询.更改追踪.以及更新功能,这意味着你的 domain classes 必须遵循 EF 所使用的约定.然而,如果你的 domain classes 不能遵循 EF 所使用的约定,此时你就需要有能力去增加一些配置使得你的 classes 能够满足 EF 所需要的信息. C

让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.