再接再厉VS 2008 sp1 + .NET 3.5 sp1(5) - Entity Framework(实体框架)之ObjectContext

EVCapture录屏软件:硬件编码低占用与参数调优指南 屏幕录制是教程制作与问题复现的刚需,但传统录屏工具常因软编码导致CPU占用飙升,影响系统流畅性。视频编码分为软编码与硬编码,硬编码借助GPU专用单元处理,能大幅降低CPU负载。EVCapture通过优先识别并调用NVENC、AMD或Intel核显硬件编码器,在1080p录制场景下可将CPU占用稳定在6%左右,同时以MP4格式直落本地,避免后期转码损耗。针对教程录制中常见的文字模糊问题,建议改用固定码率(如8-12Mbps)而非自动码率;音频方面需核对采样率匹配,防止音画不同步。对于长时录制,可结合批处理与计 阅读详情
[索引页]
[源码下载]


再接再厉VS 2008 sp1 + .NET 3.5 sp1(5) - Entity Framework(实体框架)之ObjectContext


作者: webabcd


介绍
以Northwind为示例数据库,ADO.NET Entity Framework之详解ObjectContext, 以及事务和并发
  • ObjectContext - 以对象(这些对象是 EDM 中定义的实体类型的实例)的形式与数据进行交互
  • CreateObjectName - 实体类 的 CreateObjectName 静态方法用于创建实体类的新实例
  • AddToEntitySetName() - 将需要添加的对象添加到对象上下文中
  • SaveChanges() - 将所有更新保存到相关存储区中
  • Attach()/AttachTo() - 附加外部实体到上下文中
  • ObjectContext.Refresh() - 更新上下文数据
  • ObjectStateEntry - 维护实体状态的类
  • ObjectStateManager - 实体状态管理器


示例
1、详解ObjectContext
ObjectContext.aspx
<% @ Page Title="ObjectContext" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile
="ObjectContext.aspx.cs" Inherits="EntityFramework_ObjectContext" 
%>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="head"  runat ="Server" >
</ asp:Content >
< asp:Content  ID ="Content2"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< div  id ="result"  runat ="server"   />
</ asp:Content >

ObjectContext.aspx.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;

using  System.Data.Objects;
using  System.Data.Objects.DataClasses;
using  System.Data;

using  VS2008SP1.Business;

public   partial   class  EntityFramework_ObjectContext : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            Demo();

            result.InnerHtml 
+= "<br />";

            Demo2();

            result.InnerHtml 
+= "<br />";

            Demo3();

            result.InnerHtml 
+= "<br />";

            Demo4();

            result.InnerHtml 
+= "<br />";

            Demo5();

            result.InnerHtml 
+= "<br />";

            Demo6();
        }

    }


    
private void Demo()
    
{
        
// ObjectContext -  以对象(这些对象是 EDM 中定义的实体类型的实例)的形式与数据进行交互
        using (var ctx = new NorthwindEntities())
        
{
            
// CreateObjectName - 实体类 的 CreateObjectName 静态方法用于创建实体类的新实例
            Region region = Region.CreateRegion("RegionDescription", 100);

            
// System.Data.EntityState - 实体状态
            
// System.Data.EntityState.Detached - 被分离
            
// System.Data.EntityState.Unchanged - 未发生变化
            
// System.Data.EntityState.Added - 被增加
            
// System.Data.EntityState.Deleted - 被删除
            
// System.Data.EntityState.Modified - 被修改

            result.InnerHtml 
+= region.EntityState + "<br />"; // Detached
            
// AddToEntitySetName() - 将需要添加的对象添加到对象上下文中
            
// AddObject(string entitySetName, object entity) - 将需要添加的对象添加到对象上下文中
            
// ctx.AddObject("Region", region);
            ctx.AddToRegion(region);
            result.InnerHtml 
+= region.EntityState + "<br />"; // Added

            
// SaveChanges() - 将所有更新保存到相关存储区中。将所有实体的 EntityState 标记为 EntityState.Unchanged 
            
// SaveChanges(bool acceptChangesDuringSave) - acceptChangesDuringSave 指定是否将所有实体的 EntityState 标记为 EntityState.Unchanged 。 如果指定为 false 则不会修改实体的 EntityState
            ctx.SaveChanges();

            result.InnerHtml 
+= region.EntityState + "<br />"; // Unchanged
        }

    }


    
private void Demo2()
    
{
        
using (var ctx = new NorthwindEntities())
        
{
            Region region 
= ctx.Region.First(p => p.RegionID == 100);

            result.InnerHtml 
+= region.EntityState + "<br />"; // Unchanged
            region.RegionDescription = "RegionDescriptionUpdated";
            result.InnerHtml 
+= region.EntityState + "<br />"; // Modified

            ctx.SaveChanges(
false);
            
            
// ObjectStateEntry - 维护实体状态的类
            
//     GetModifiedProperties() - 获取被修改的属性。返回值 IEnumerable<string> 
            
// ObjectStateManager - 实体状态管理器
            
//     GetObjectStateEntry()/TryGetObjectStateEntry() - 获取指定实体的 ObjectStateEntry
            
//     GetObjectStateEntries(EntityState state) - 获取所指定状态的 ObjectStateEntry 集合。返回值 IEnumerable<ObjectStateEntry>
            
//     ObjectStateManagerChanged事件 - 将实体添加到 ObjectStateManager 中或从中移除实体时发生
            ObjectStateEntry ose = ctx.ObjectStateManager.GetObjectStateEntry(region);

            
// ObjectStateEntry.State - 实体状态
            
// ObjectStateEntry.OriginalValues - 原始值
            
// ObjectStateEntry.CurrentValues - 当前值
            result.InnerHtml += ose.State + "<br />"; // Modified (region.EntityState)
            result.InnerHtml += ose.OriginalValues["RegionDescription"] + "<br />"; // RegionDescription
            result.InnerHtml += ose.CurrentValues["RegionDescription"] + "<br />"; // RegionDescriptionUpdated

            
// ObjectStateEntry.AcceptChanges()/ObjectContext.AcceptAllChanges() - 将相关的实体状态置为 EntityState.Unchanged
            ose.AcceptChanges();

            result.InnerHtml 
+= ose.State + "<br />"; // Unchanged
        }

    }


    
private void Demo3()
    
{
        
using (var ctx = new NorthwindEntities())
        
{
            
// 加载指定的 Region 到上下文中
            Region regionRead = ctx.Region.First(p => p.RegionID == 100);
            
// 创建一个需要更新的 Region
            Region regionUpdate = Region.CreateRegion("RegionDescriptionUpdatedSecond", 100);

            result.InnerHtml 
+= regionRead.EntityState + "<br />"; // Unchanged
            result.InnerHtml += regionUpdate.EntityState + "<br />"; // Detached
            
// ApplyPropertyChanges(string entitySetName, object changed) - 更新指定的实体(其所对应的主键实体需要加载到上下文中)
            ctx.ApplyPropertyChanges("Region", regionUpdate);
            result.InnerHtml 
+= regionRead.EntityState + "<br />"; // Modified
            result.InnerHtml += regionUpdate.EntityState + "<br />"; // Detached

            ctx.SaveChanges();
        }

    }


    
private void Demo4()
    
{
        
using (var ctx = new NorthwindEntities())
        
{
            Region region 
= new Region() { RegionID = 100, RegionDescription = "RegionDescriptionUpdatedThird" };

            result.InnerHtml 
+= region.EntityState + "<br />"; // Detached

            
// Attach()/AttachTo() - 附加外部实体到上下文中
            
// ctx.Attach(region);
            ctx.AttachTo("Region", region);

            ObjectStateEntry ose 
= ctx.ObjectStateManager.GetObjectStateEntry(region);

            
// SetModified() - 标记实体状态为 EntityState.Modified
            
// SetModifiedProperty() - 标记需要修改的属性,从而完成对指定属性的修改
            ose.SetModifiedProperty("RegionDescription");

            
// 以当前数据为准更新存储模型
            ctx.Refresh(RefreshMode.ClientWins, region);  

            result.InnerHtml 
+= region.EntityState + "<br />"; // Modified

            ctx.SaveChanges();
        }

    }


    
private void Demo5()
    
{
        
using (var ctx = new NorthwindEntities())
        
{
            Region region 
= new Region() { RegionID = 100 };

            
// CreateEntityKey(string entitySetName, object entity) - 创建 EntityKey
            EntityKey ek = ctx.CreateEntityKey("Region", region);

            
// ObjectContext.GetObjectByKey()/TryGetObjectByKey() - 根据指定的 EntityKey 获取实体
            Region r = ctx.GetObjectByKey(ek) as Region;

            ctx.SaveChanges();

            result.InnerHtml 
+= r.RegionDescription + "<br />"; // RegionDescriptionUpdatedThird 
        }

    }


    
private void Demo6()
    
{
        
using (var ctx = new NorthwindEntities())
        
{
            Region region 
= ctx.Region.First(p => p.RegionID == 100);

            result.InnerHtml 
+= region.EntityState + "<br />"; // Unchanged

            
// ObjectStateEntry.Delete() - 标记实体的状态为删除。同 DeleteObject()
            ObjectStateEntry ose = ctx.ObjectStateManager.GetObjectStateEntry(region);
            ose.Delete();

            
// DeleteObject() - 删除实体
            
// ctx.DeleteObject(region);

            result.InnerHtml 
+= region.EntityState + "<br />"; // Deleted

            ctx.SaveChanges();
        }

    }

}



2、事务和并发处理
ObjectContext2.aspx
<% @ Page Title="事务和并发处理" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile
="ObjectContext2.aspx.cs" Inherits="EntityFramework_ObjectContext2" 
%>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="head"  runat ="Server" >
</ asp:Content >
< asp:Content  ID ="Content2"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< div  id ="result"  runat ="server"   />
</ asp:Content >

ObjectContext2.aspx.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;

using  System.Data.Objects;
using  System.Data.Objects.DataClasses;
using  System.Data;

using  VS2008SP1.Business;

public   partial   class  EntityFramework_ObjectContext2 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            
// 演示事务的 Demo
            Demo();

            result.InnerHtml 
+= "<br />";

            
// 演示并发的 Demo
            Demo2();
        }

    }


    
private void Demo()
    
{
        
// ObjectContext - SaveChanges 中的逻辑会自动做事务处理

        
// 通吃的事务处理
        
// using (System.Transactions.TransactionScope tc = new TransactionScope())
        
// {
        
//     code
        
//     tc.Complete(); 
        
// }

        
// 同一 ObjectContext 的多个 SaveChanges() 的事务处理
        using (var ctx = new NorthwindEntities())
        
{
            Region region 
= Region.CreateRegion("Test", 101);
            ctx.AddToRegion(region);

            
if (ctx.Connection.State != ConnectionState.Open)
            
{
                ctx.Connection.Open();
            }


            
// 开始一个事务
            System.Data.Common.DbTransaction tran = ctx.Connection.BeginTransaction();

            
// 第一次对数据的操作
            ctx.SaveChanges();

            
try
            
{
                Region region2 
= Region.CreateRegion("Test2", 101);
                ctx.AddToRegion(region2);
                
// 第二次对数据库的操作
                ctx.SaveChanges();

                
// 提交事务(第一次插入主键为 101 的记录,成功;第二次再次插入主键为 101 的记录,失败。所以此处会报错)
                tran.Commit();
            }

            
catch (Exception)
            
{
                result.InnerHtml 
+= "回滚" + "<br />";

                
// 回滚事务(第一次插入成功的主键为 101 的记录会被删除)
                tran.Rollback();
            }

        }

    }


    
private void Demo2()
    
{
        var ctx 
= new NorthwindEntities();
        var ctx2 
= new NorthwindEntities();

        var region 
= ctx.Region.First();
        var region2 
= ctx2.Region.First();

        
// 需要做并发处理的字段,要将其“并发模式”属性设置为 Fixed
        region.RegionDescription = "Eastern" + Guid.NewGuid().ToString();
        region2.RegionDescription 
= "Eastern" + Guid.NewGuid().ToString();

        ctx.SaveChanges();

        
try
        
{
            
// ctx 已经修改了 Region 的 RegionDescription 属性
            
// ctx2 再次修改 Region 的 RegionDescription 属性,由于 RegionDescription 在 ctx2 读取之后发生了变化,所以会出现乐观并发(Optimistic Concurrency)问题
            ctx2.SaveChanges();
        }

        
catch (System.Data.OptimisticConcurrencyException)
        
{
            result.InnerHtml 
+= "OptimisticConcurrencyException" + "<br />";

            
// ObjectContext.Refresh(RefreshMode refreshMode, object entity) - 更新上下文数据
            
//     RefreshMode.StoreWins - 以数据库中的值为准
            
//     RefreshMode.ClientWins - 以当前数据为准
            
//     object entity - 需要刷新上下文数据的实体
            ctx2.Refresh(RefreshMode.StoreWins, region2);
            
// ctx2.Refresh(RefreshMode.ClientWins, region2);

            ctx2.SaveChanges();
        }


        
// 可以不通过 try catch 处理并发,而是通过 Refresh() 直接处理更新逻辑
        
// 即若是 RefreshMode.ClientWins 则永远以当前值为准;若是 RefreshMode.StoreWins 则永远以数据库中的值为准(不会更新数据)
        
// ctx2.Refresh(RefreshMode.StoreWins, region2);
        
// ctx2.SaveChanges();

        ctx.Dispose();
        ctx2.Dispose();
    }

}


OK
[源码下载]
[EF] ADO.NET 3.5 高级编程 (LINQ 和 Entity Framework 实现) (英文版) ☆ 资源说明:☆ [Wrox] ADO.NET 3.5 高级编程 (LINQ 和 Entity Framework 实现) (英文版) [Wrox] Professional ADO.NET 3.5 with LINQ and the Entity Framework (E-Book) ☆ 出版信息:☆ [作者信息] Roger Jennings [出版机构] Wrox [出版日期] 2009年02月03日 [图书页数] 672页 [图书语言] 英语 [图书格式] PDF 格式 立即下载

相关推荐

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4571

Entity Framework开发介绍

一、Entity Framework概要        Entity Framework是微软的Object Relational Mapper(对象关系映射),也就是我们平常说的ORM,它可以让应用程序开发者将关系型数据作为业务模型来使用,也消除了开发者为数据访问编写的绝大多数管道代码的需要(比如使用ADO.NET)。Entity Framework提供了一个综合的、基于模型的系统,通过摆脱为所...

weixin_34055910的博客 258

【S32K】S32K144入门笔记(4) Lin (Lin stack组件) 驱动超声波雷达实例

0. 引言 Lin这块是我一直没弄懂的部分。很多东西一知半解,当时感觉是硬凑了答案出来。 果然过标的时候出了问题,几个小伙伴帮忙一起刷夜也没搞定,好在标还是顺利过了,不然罪过大了。 之前做lin这块一直用的是linStack组件,这部分包含了协议栈部分,需要对lin的协议比较清楚和理解才好配置。 尤其是,图形界面配置完成后会生成一个ldf文件,这个文件很重要,所有的代码都是基于这个文件生成的,但是这个文件我确认没找到什么介绍资料,所以很多配置都是一点一点凑出来的,再实际验证的。 抓住这次写文档的机会,把当时

YoYo的桃子树 1万+

Entity Framework3.5 关于外键表的一些经验

自从MVC3 RTM版本发布以来,我一直对Mv3c非常感兴趣,尤其是新发布的Entity Framework Code-First以来,我就被它深深地吸引,一句话真的很好用。 但是,最近接到一个项目,要求使用万网的虚拟主机,无奈虚拟主机不支持.Net Framework4,所以只好采用.Net Framework3.5了,那么数据访问技术自然也就只能用Entity Fr...

dkl5394的博客 257

Vue3+Element Plus:构建现代化后台管理系统的核心布局实践

本文详细介绍了使用Vue3和Element Plus构建现代化后台管理系统的核心布局实践。从开发环境搭建到核心布局设计,再到动态菜单与路由集成,提供了完整的解决方案和优化技巧。特别适合需要快速开发高效、响应式后台系统的开发者,通过实战案例展示了如何提升开发效率和系统性能。

weixin_28309723的博客 457

数学:箭头符号→(to)都表示什么意义?

数学符号“→”在不同领域有不同含义:在逻辑中表示“蕴含”(p→q);在函数中表示映射关系(f:A→B);在极限中表示变量趋近(x→a);在推导过程中表示推理方向(A→B)。此外,它也可能用于向量表示或数列趋势。其具体含义需结合上下文判断,核心应用场景包括逻辑运算、函数定义、极限分析和数学推导等。

shunzi2016的博客 5563

再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) - Entity Framework(实体框架)之详解 Linq To Entities 之一...

[索引页][×××] 再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) - Entity Framework(实体框架)之详解 Linq To Entities 之一作者:webabcd介绍以Northwind为示例数据库,ADO.NET Entity Framework之Linq To Entities First - 返回集合中的第一个成员;不延...

weixin_33751566的博客 120

YOLO26科研升级:OREPA在线重参数化,让模型精度在训练中持续跃升

在目录下,新建AddModules文件夹,将orepa.py放入其中。

LXY_LOVE36的博客 98

再接再厉VS 2008 sp1 + .NET 3.5 sp1系列文章索引

[源码下载]再接再厉VS 2008 sp1 + .NET 3.5 sp1系列文章索引作者:webabcd介绍再接再厉VS 2008 sp1 + .NET 3.5 sp1系列文章索引:ADO.NET Entity Framework(实体框架), ADO.NET Data Services(数据服务), Dynamic Data(动态数据) 1、再

webabcd的专栏 948

AM芯片性能测试

目前车载FM&AM没有明确的国标,因此各家测试项目可能不同,最主要测试标准比较混乱,多是根据具体芯片的规格书以及与芯片厂商协商。信号发生器:R&S SMCV100B音频分析仪:R&S UPV AUDIO AYALYZER DC 250KHZ(AP的也可以)专用USB-I2C控制模块(不同芯片控制模块不同,例如SPI或UART的控制模块)卡农线(针对模拟声道输出,+接左/右声道,-接GND,地可接GND也可悬空)

qflook的博客 902

YOLO26 网络结构逐模块解析:Backbone/Neck/Head

本文解析了YOLO26目标检测网络的架构设计,重点介绍其在Backbone、Neck和Head三个核心组件的创新优化。Backbone采用改进的CSP模块与轻量级注意力机制,提升特征提取效率;Neck使用改进的BiFPN结构实现高效多尺度特征融合;Head采用完全解耦设计简化回归流程。文章详细分析了各模块的技术演进、实现细节和设计思想,通过流程图和代码示例展示了YOLO26的整体架构和关键组件实现。该研究对模型优化、定制开发和硬件部署具有重要指导意义。

一键难忘的博客 1241

再接再厉VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(实体框架)之EntityClient, ObjectQuery

[索引页][源码下载]再接再厉VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(实体框架)之EntityClient, ObjectQuery作者:webabcd介绍以Northwind为示例数据库,ADO.NET Entity Framework之详解EntityClient, ObjectQueryEntityConnection - 与

webabcd的专栏 751

ABB变频器使用PROFINET IO通信模块时的激活方法

ABB变频器使用PROFINET IO通信模块时的激活方法

Robot_PLC_HMI_Automation 2732

Entity Framework介绍

返回《8天掌握EF的Code First开发》总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具有的能力 Entity Framework的架构 Entity Framework建模和持久化 Entity Framework的三种开发风格 如何选择持久化方法 本章小结 自我测试 Ent...

第27号专栏 7051

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

再接再厉VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(实体框架)之EntityClient, ObjectQuery...

[索引页][×××] 再接再厉VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(实体框架)之EntityClient, ObjectQuery作者:webabcd介绍以Northwind为示例数据库,ADO.NET Entity Framework之详解EntityClient, ObjectQuery EntityCo...

weixin_34240657的博客 89

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VS2010 没有ado.net entity data model?

我的.net mvc程序中想建ado.net entity data model,但是新建项中找不到这个模板,controlers新建找得到controlers的模板,请教该怎么解决。 .NET Framework 3.5 sp1 , ADO.NET 3.5 Entity Framework 实体框架是在SP1中引入的,必须打上sp1不到。 vs2008也是如此,否则没有实体数据模型的模板(...

weixin_30808253的博客 86

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linq to sql =>; ADO.NET Entity Framework

花了一天的时间把项目从linq2sql转到ADO.NET Entity Framework。 此项目bs部分工程量不算多,复杂的功能都做在cs部分上,bs只负责基础数据的维护和报表统计, 其实用linq2sql也可以满足了,但是linq2sql designer用得实在太不爽了,表少的时候还能应付,现在表增加到70几个了,找个表得找半天,linq2sql desinger也不提供个搜索功能:( 前...

weixin_34049948的博客 68
上一篇: 再接再厉VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(实体框架)之EntityClient, ObjectQuery
下一篇: 再接再厉VS 2008 sp1 + .NET 3.5 sp1(6) - Entity Framework(实体框架)之Entity SQL
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值