Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?
今天为大家带来DbSet.Local属性的使用与实现。和上次介绍的Find函数首先查找context中缓存的实体类似DbSet的Local属性也是返回context中缓存并且被跟踪的实体。不同点在于Local属性不会返回状态为EntityState.Deleted的实体且即使缓存中什么实体都没有也不会对数据库进行访问。这样的设计也正符合Local本地之意。看一个例子using(var dbnewMyDbContext()){//此处调用EF4.1的新扩展方法DbSet.Load()从数据库导入对应的实体到缓存中db.People.Load();db.People.Add(newPerson { NameMichael});db.People.Remove(db.People.Find(1));foreach(var pindb.People.Local){//这里调用了EF4.1的新方法Entry来得到实体的DbEntryEntryConsole.WriteLine(Found {0}: {1} with state {2}, p.PersonID, p.Name, db.Entry(p).State);}}这里的输出结果类似于Found 0: Michael with state AddedFound 2: Jennie with state UnchangedFound 3: Bob with state UnchangedFound 4: Mike with state Unchanged...PersonID为1的实体不会出现在这里因为此时它的状态是Deleted。而姓名为Michael的实体因为是新增的实体其主键还没有在数据库端生成所以其PersonID为0。Local属性为什么这么设计呢照理说状态为Deleted的实体同样应该是本地缓存的啊读者可能会发现Local属性返回的数据类型是ObservableCollectionT。我们知道ObservableCollectionT常被用于WPF数据绑定。其实Local属性的设计也是为了方便大家做数据绑定的。试想在数据绑定时如果被我们删除的实体仍然出现在Local属性的集合中UI控件则会仍然显示这些已被我们标记为Deleted的实体。反之对于新增的实体但还没有将更新提交到数据库我们当然希望在做数据绑定时UI控件也能显示它们的信息。再为大家介绍一些背景知识过去我们如果直接把控件绑定到EF的ObjectSetT集合上如果我们删除某些实体并未提交数据库UI控件会有相应的反应也删除实体。但是当我们调用类似AddObject方法在ObjectSetT里新增实体时UI控件并不会有任何变化新增实体不出现在控件。个人觉得这是之前EF设计上的一些缺陷。有关更详细的讨论请参阅这个MSDN帖子Microsoft QA | Microsoft Learn。有关Local属性的用法以及如何使用Local属性来做WPF和Winform数据绑定可以参阅这三篇ADO.NET产品组的博文如果大家需要我也可以对这些博文做翻译工作或者写一些有关EF数据绑定的文章http://blogs.msdn.com/b/adonet/archive/2011/02/01/using-dbcontext-in-ef-feature-ctp5-part-7-local-data.aspxhttp://blogs.msdn.com/b/adonet/archive/2011/03/08/ef-feature-ctp5-code-first-model-with-master-detail-wpf-application.aspxhttp://blogs.msdn.com/b/adonet/archive/2011/02/16/ef-feature-ctp5-code-first-and-winforms-databinding.aspx下面我们一起来分析下Local属性的实现。由于没有EF4.1的源码所以仍然使用.NET Reflector。 DbSet.Local属性是只读的。其get方法调用EF内部封装的InternalSetT.Local属性(同样只读。这里和上次介绍的DbSet.Find函数一样先调用DetectChanges函数来同步POCO实体的状态。有关DetectChanges函数详见MSDN文档Working with POCO Entities publicObservableCollectionTEntityLocal{get{this.InternalContext.DetectChanges(false);if(this._localViewnull){DbLocalViewTEntityview1this._localView;}return(this._localViewnewDbLocalViewTEntity(this.InternalContext));}}这里判断_localView对象是否为NULL但这里的逻辑我也不是很明白。在咨询了产品组之后发现这是Reflector 6.5的分析IL时的一个问题。正确的代码应该是使用了类似于C# ??的运算符来判断_localView对象是否为NULL。如果为NULL则生成一个DbLocalViewTEntity的对象并返回。publicObservableCollectionTEntityLocal{get{this.InternalContext.DetectChanges(false);returnthis._localView??(this._localViewnewDbLocalViewTEntity(this.InternalContext));}}下面看看DbLocalViewTEntity类的构造函数publicDbLocalView(InternalContext internalContext){this._internalContextinternalContext;try{this._inStateManagerChangedtrue;foreach(TEntity localinthis._internalContext.GetLocalEntitiesTEntity()){base.Add(local);}}finally{this._inStateManagerChangedfalse;}this._internalContext.RegisterObjectStateManagerChangedEvent(newCollectionChangeEventHandler(this.StateManagerChangedHandler));}这里两个比较关键的函数是GetLocalEntities和RegisterObjectStateManagerChangedEvent。前者是调用了ObjectStateManager.GetObjectStateEntries(EntityState.Modified| EntityState.Added| EntityState.Unchanged)以得到状态为Modified、Added和Unchanged的实体对象。而后者则是Local属性实现数据绑定功能的关键将StateManagerChangedHandler这个事件处理函数赋给ObjectStateManager.ObjectStateManagerChanged事件。该事件是当任何实体被添加或从ObjectStateManager中删除时都会被激发的。StateManagerChangedHandler函数其实就是在ObjectStateManagerChanged事件被激发时调用对应的ObservableCollectionT.Remove或ObservableCollectionT.Add操作。这样也就将ObservableCollectionT和EF缓存的实体联系了起来简单的数据绑定便实现了。privatevoidStateManagerChangedHandler(objectsender, CollectionChangeEventArgs e){try{this._inStateManagerChangedtrue;TEntity elemente.ElementasTEntity;if(element!null){if((e.ActionCollectionChangeAction.Remove)base.Contains(element)){base.Remove(element);}elseif((e.ActionCollectionChangeAction.Add)!base.Contains(element)){base.Add(element);}}}finally{this._inStateManagerChangedfalse;}}

相关新闻

面试官问:项目中分布式事务怎么处理的?

面试官问:项目中分布式事务怎么处理的?

第一层:先讲本地事务 Transactional(基础铺垫)先从单体本地事务切入,体现基础功底:单体服务单库场景,我们用 Spring 的 Transactional 声明式本地事务;底层依靠 AOP 实现,保证同一个…

2026/7/5 3:23:00 阅读更多 →
KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

1. 项目概述:KARL权限模型不是“配个role”就完事的系统工程KARL——这个在开源知识协作领域低调但极具设计深度的平台,它的权限体系远非传统RBAC(基于角色的访问控制)所能简单概括。我第一次接触KARL是在2021年参与一个高校数字人…

2026/7/5 3:18:59 阅读更多 →
微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向实战:从文件头特征到自定义解密工具开发在移动互联网时代,即时通讯软件产生的数据安全一直是个值得关注的话题。作为国内主流的社交应用,微信对本地存储的图片、视频等多媒体文件采用了特定的加密保护措施。本文将带您深入探…

2026/7/5 3:18:59 阅读更多 →

最新新闻

3分钟掌握Crontab UI:告别命令行恐惧的Linux定时任务可视化管理神器

3分钟掌握Crontab UI:告别命令行恐惧的Linux定时任务可视化管理神器

3分钟掌握Crontab UI:告别命令行恐惧的Linux定时任务可视化管理神器 【免费下载链接】crontab-ui Easy and safe way to manage your crontab file 项目地址: https://gitcode.com/gh_mirrors/cr/crontab-ui 还在为复杂的crontab语法而烦恼吗?Cro…

2026/7/5 4:19:14 阅读更多 →
如何专业测试显示器刷新率:5种方法验证VRR功能的终极指南

如何专业测试显示器刷新率:5种方法验证VRR功能的终极指南

如何专业测试显示器刷新率:5种方法验证VRR功能的终极指南 【免费下载链接】VRRTest A small utility I wrote to test variable refresh rate on Linux. Should work on all major OSes. 项目地址: https://gitcode.com/gh_mirrors/vr/VRRTest 显示器可变刷新…

2026/7/5 4:19:14 阅读更多 →
5个步骤搭建免费动作捕捉系统:FreeMoCap完全指南

5个步骤搭建免费动作捕捉系统:FreeMoCap完全指南

5个步骤搭建免费动作捕捉系统:FreeMoCap完全指南 【免费下载链接】freemocap Free Motion Capture for Everyone 💀✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap FreeMoCap是一个免费开源的动作捕捉系统,为所有人提…

2026/7/5 4:17:14 阅读更多 →
Day3 第二章 链表part2

Day3 第二章 链表part2

了解链表 1. 什么是链表 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)…

2026/7/5 4:17:14 阅读更多 →
聊城食品洁净车间建设指南,按加工场景适配净化板更耐用

聊城食品洁净车间建设指南,按加工场景适配净化板更耐用

聊城作为鲁西农副产品加工核心区域,形成禽肉屠宰、速冻预制菜、果蔬深加工、杂粮面点、宠物食品五大加工集群,大量新建洁净车间、老旧厂房改造需求持续增多。本地的特殊工况,也让选择板材变得复杂纠结起来。 生产线全天用水冲洗,血…

2026/7/5 4:15:13 阅读更多 →
基于TB9051FTG与MSP432的静音直流电机控制方案

基于TB9051FTG与MSP432的静音直流电机控制方案

1. 项目背景与核心需求在工业自动化、消费电子和机器人领域,直流电机控制一直是个经典课题。传统PWM调速方案虽然简单易实现,但存在明显的电磁噪声和机械振动问题——当PWM频率落在人耳可听范围(20Hz-20kHz)时,电机会发…

2026/7/5 4:13:13 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻