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

 public enum EntityState
{
Added = ,
Deleted = ,
Detached = ,
Modified = 0x10,
Unchanged =
}

 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 = ,
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 = ,
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(),就会去获取这些变化,进行操作数据

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

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

    1. LINQ  TO SQL  和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist   ...

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

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

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

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6  获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 ...

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

    在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntitySt ...

  5. Entity Framework基础01

    学习了ADO.NET的相关知识,掌握了它对数据库表的基本操作,但是实际在开发项目应用中微软为我们开发ef这个ORM,使用它可以很方便的利用ADO.NET来操作DBMS,使得我们开发项目的着重点放在业务 ...

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

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  8. Entity Framework 学习整理(分播客整理)

    MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...

  9. Entity Framework 基本概念

    概念 LINQ to Entities 一种 LINQ 技术,使开发人员可以使用 LINQ 表达式和 LINQ 标准查询运算符,针对实体数据模型 (EDM) 对象上下文创建灵活的强类型化查询. ESQ ...

随机推荐

  1. HttpClientUtil 工具类 实现跨域请求数据

    package com.xxx.common.util; import java.io.IOException; import java.net.URI; import java.util.Array ...

  2. myloader恢复mysql数据库演示样例

     mydumper是针对mysql数据库备份的一个轻量级第三方的开源工具.备份方式为逻辑备份.它支持多线程.备份速度远高于原生态的mysqldump以及众多优异特性.与其相配套的恢复工具则是mylo ...

  3. Atitit.auto complete 自己主动完毕控件的实现总结

    Atitit.auto complete  自己主动完毕控件的实现总结 1. 框架选型 1 2. 自己主动完毕控件的ioc设置 1 3. Liger  自己主动完毕控件问题 1 4. 官网上的code ...

  4. 实战c++中的vector系列--emplace_back造成的引用失效

    上篇将了对于struct或是class为何emplace_back要优越于push_back,可是另一些细节没有提及.今天就谈一谈emplace_back造成的引用失效. 直接撸代码了: #inclu ...

  5. MTK Camera驱动移植

    对于MTK Camera驱动移植一般分为四部分: 1.硬件IO口配置: 2.Camera驱动移植: 3.上电时序. 4.改动i2c控制器: 硬件电路: 1.GPIO配置 打开 mediatek\dct ...

  6. 为什么有些信号线串接33R小电阻?

    本人只是刚入坑的硬件助理,一名小白,很多都知识不懂,以下信息多数来自网络,可能不准确,恳请批评指正! 正文: 参考资料:http://blog.csdn.net/xiangyuqxq/article/ ...

  7. 南阳oj 语言入门 A+B paoblem 题目477 题目844

     A+Bproblem   题目844 两个数字翻转后相加   比方10+12 翻转后01+21=22 #include<stdio.h> int main() { int ji(in ...

  8. 2016/2/18 html 标签 表格

    ①打开dreamw新建html 开头显示如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  9. 修改数据表的字符集为utf8mb4

    修改数据表的字符集为utf8mb4

  10. 查看jvm常用命令

    jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强 ...