EF:加入容器三种方式-->查询,attach,entry.不在容器里,不能用remove,add等方法.

1.0 使用Attach可能会出错.//attach 意思:附上; 贴上,系;
var db = new PhoneBookEntities();
var queryCi=db.ContactInfo.FirstOrDefault(c => c.ID == 10);//使EF容器中存在代理类,状态Unchanged
ContactInfo ci=new ContactInfo(){ID=10};
db.ContactInfo.Attach(ci);
附加类型“MyMvc.Models.ContactInfo”的实体失败,因为相同类型的其他实体已具有相同的主键值。
容器中已存在该实体对象的代理类,而Attach方法却要把代理类的状态设置为Unchanged,可能与原代理类的状态冲突,所以报错.

var db = new PhoneBookEntities();
var queryCi=db.ContactInfo.FirstOrDefault(c => c.ID == 10);
db.ContactInfo.Attach(queryCi);//原代理类状态是Unchanged,Attach方法也是把代理类的状态设置为Unchanged,不冲突.
这么写不会报错.不过是没意义的写法.

2.0 Entry方法返回实体对象的代理类,Attach方法返回实体对象
ContactInfo c1 = db.ContactInfo.FirstOrDefault(c => c.ID == 10);
DbEntityEntry<ContactInfo> x1 = db.Entry(c1);
ContactInfo x2 = db.ContactInfo.Attach(c1);

3.0 如果某个实体对象在EF容器中已有代理类,用Entry方法也不会报错,返回代理类而已,state不变.
如果用Entry方法前,state=Unchanged,那么,返回的代理类的state也是Unchanged;
如果用Entry方法前,state=Deleted,那么,返回的代理类的state也是Deleted.
var db = new PhoneBookEntities();
ContactInfo ci = db.ContactInfo.FirstOrDefault(c => c.ID == 10);
var c1 = db.ContactInfo.Remove(ci);
string sC1 = db.Entry(ci).State.ToString();//Deleted
var c2 = db.ContactInfo.Attach(ci);
string sc2 = db.Entry(ci).State.ToString();//Attach方法把代理类状态从Deleted变为Unchanged.

小结,为了避免使用Attach方法而报错,尽量少用Attach方法或者Attach已经查询过的容器中已有的对象
4.0 如果一个实体对象在容器中不存在,那么Entry方法拿到的代理类的状态是Detached.
再经过Attach方法,代理类的状态变为Unchanged.
var db = new PhoneBookEntities();
var ci = new ContactInfo() {ID = 10};
var state= db.Entry(ci).State.ToString();//Detached:此状态表示未附加,db.SaveChanges();不会影响到这个实体对象.
db.ContactInfo.Attach(ci);
state = db.Entry(ci).State.ToString();//Unchanged

Detached状态表示EF容器不会跟踪实体对象的变化,EF性能更好.

什么时候用?展示数据的时候使用.

使用方法,例如:db.ContactInfo.AsNoTracking().Where(c=>c.ID>2);

MVC EF中Attach和Entry区别的更多相关文章

  1. 关于EF中ApplyCurrentValues和ApplyOriginalValues区别

    关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. //        // 摘要:        //     将 System.D ...

  2. mvc+ef中比较数据

    例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...

  3. ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel

    EO: Entity Object 就是EF中的实体类, 对EO的操作会对数据库产生影响. DTO: Data Transfer Object 数据传输对象.用于在各层之间传递数据的普通类,DTO有哪 ...

  4. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  5. C# MVC EF中匿名类使用

    控制器中代码: var list = context.Says.Join( context.Users, a => a.UserId, b => b.Id, (a, b) => ne ...

  6. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  7. [转帖]Asp.Net MVC EF各版本区别

    Asp.Net MVC EF各版本区别 https://www.cnblogs.com/liangxiaofeng/p/5840754.html 2009年發行ASP.NET MVC 1.0版 201 ...

  8. ASP.NET MVC EF直接更新数据(不需查询)

    EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...

  9. MVC+EF 理解和实现仓储模式和工作单元模式

    MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...

随机推荐

  1. 一个App完成入门篇(三)-完善主框架

    本节教程将继续带领大家完善教学demo 导入项目 完善主框架 完成viewShower子视图 打开新页 启动动画 将要学习的demo效果图如下所示 1. 如何导入完整项目 本节示例demo请参考下载地 ...

  2. [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

    1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...

  3. SignalR + KnockoutJS + ASP.NET MVC4 实现井字游戏

    1.1.1 摘要 今天,我们将使用SignalR + KnockoutJS + ASP.NET MVC实现一个实时HTML5的井字棋游戏. 首先,网络游戏平台一定要让用户登陆进来,所以需要一个登陆模块 ...

  4. Spring Trasnaction管理(2)- 事务AOP

    问题导读 spring AOP是在如何进行的 spring 用cglib和jdkProxy管理的事务有何区别 Spring AOP管理 Spring主要的两个核心功能IOC与AOP.IOC的代码解析可 ...

  5. 跨终端 Web

    跨终端 Web(移动优先|响应式|HTML5|Hybrid|桌面+移动应用|一线前端负责人联袂推荐) 徐凯  著   ISBN 978-7-121-23345-6 2014年6月出版 定价:55.00 ...

  6. SSH框架详解

    1.什么是ssh? SSH对应 struts spring hibernate struts 采用MVC模式,主要是作用于用户交互 spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合 ...

  7. .net生成随机字符串

    生成随机字符串的工具类: /// <summary> /// 随机字符串工具类 /// </summary> public class RandomTools { /// &l ...

  8. angularjs with node service

  9. 关于JavaScript闭包的小问题

    怎么说,闭包大体也就是作用域的问题.闭包的一个用途是用于模块化,保护函数体内的私有变量,如: var foo = function(){ var _num = 1; var sayHello = fu ...

  10. 解析大型.NET ERP系统 代码的坏味道

    1  对用户输入做过多的约定和假设 配置文件App.config中有一个设定报表路径的配置节: <add key="ReportPath" value="C:\Us ...