EF框架step by step(5)—处理实体简单属性
EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录。当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值。
先通过简单的代码演示一下如何获取这两个值,仍采用上彷文章的案例,多余代码不在展示
数据库内容如下图示

简单获取当前值,初始值

using (BlogDbContext db = new BlogDbContext())
{ BlogUser blogUser = db.BlogUsers.Find(4); ///通过db.Entry(blogUser).Property获取值,参数可以为Lamada表达式,也可以是字符串
///通过Lambda表达式获取当前值,用Lamada表达式时,返回值为强类型,即返回当前属性的类型
///而用字符串做为参数时,返回值为object
string currentName= db.Entry(blogUser)
.Property(user => user.BlogName).CurrentValue;
//object currentObj= db.Entry(blogUser).Property("BlogName").CurrentValue; Console.WriteLine("当前值:{0}",currentName); ///获取原始值
string orgName = db.Entry(blogUser).Property(user => user.BlogName).OriginalValue;
///string orgName = db.Entry(blogUser).Property("BlogName")
/// .OriginalValue.ToString();
Console.WriteLine("原始值:{0}",orgName); //修改对象的值
blogUser.BlogName = "宁采臣";
//db.Entry(blogUser).Property(u => u.BlogName).CurrentValue = "宁采臣";
Console.WriteLine("修改后的值为:{0}",blogUser.BlogName);
Console.WriteLine("修改后,再次获取当前值与原始值");
currentName = db.Entry(blogUser).Property(u => u.BlogName).CurrentValue;
orgName = db.Entry(blogUser).Property("BlogName").OriginalValue.ToString();
Console.WriteLine("当前值:{0}", currentName);
Console.WriteLine("原始值:{0}", orgName); }

运行结果如图:

监控值是否修改:当属性值被改变后,DbContext会自动监测到,可以通过IsModified属性获得。

BlogUser blogUser = db.BlogUsers.Find(4);
///输出 False
Console.WriteLine(db.Entry(blogUser).Property(user => user.BlogName).IsModified); blogUser.BlogName = "宁采臣"; ///输出 True
Console.WriteLine(db.Entry(blogUser).Property(user => user.BlogName).IsModified);

关闭属性修改监测 如果不想让DbContext自动监测,可以设置
db.Configuration.AutoDetectChangesEnabled = false;
强制设置某个属性被更改
db.Entry(blogUser).Property(user => user.BlogName).IsModified = true;
跟踪DbContext中不存在的实体
///新构造一个实体对象
BlogUser newBlogUser = new BlogUser() { BlogName = "Jack" };
///获取其实属性值
var currentName= db.Entry(newBlogUser).Property(user => user.BlogName).CurrentValue;///返回Jack
获取所有属性值,包括当前值,原始值以及数据库里保存的值

BlogUser blogUser = db.BlogUsers.Find(4);
blogUser.BlogName = "宁采臣"; ///EF框架直接执行sql语句,更数数据库,不需要调用db.SaveChanges()
db.Database.ExecuteSqlCommand("update blogusers set blogName='Jack' where BlogUserId=4"); Console.WriteLine("当前值");
PrintValues(db.Entry(blogUser).CurrentValues);
Console.WriteLine("原始值");
PrintValues(db.Entry(blogUser).OriginalValues);
Console.WriteLine("数据库值");
PrintValues(db.Entry(blogUser).GetDatabaseValues());


private static void PrintValues(DbPropertyValues values)
{
foreach (var propertyName in values.PropertyNames)
{
Console.WriteLine("{0}={1}",propertyName, values[propertyName]);
}
}

运行结果如下:

这种检测方法,在多用户,允许并发编辑时,可以偿试使用。 用其它对象为当前对象属性赋值

BlogUser blogUser = new BlogUser() { BlogUserId = 1, BlogName = "燕赤霞" };
db.BlogUsers.Attach(blogUser);
var newUser1 = new BlogUser() { BlogUserId = 1, BlogName = "宁采臣" };
var newUser2 = new BlogUserDTO() { Id = 2, BlogName = "黑山老妖" };
var entry = db.Entry(blogUser);
entry.CurrentValues.SetValues(newUser1);
entry.OriginalValues.SetValues(newUser2);
PrintValues(entry.CurrentValues);
PrintValues(entry.OriginalValues);


public class BlogUserDTO
{
public int Id { get; set; }
public string BlogName { get; set; }
}

用Dictionary 为对象属性赋值

BlogUser blogUser = db.BlogUsers.Find(4);
Dictionary<string, string> setValues = new Dictionary<string, string>()
{
{"BlogName","宁采臣"}
}; PrintValues(db.Entry(blogUser).CurrentValues); foreach (var propertyName in setValues.Keys)
{
db.Entry(blogUser).CurrentValues[propertyName] = setValues[propertyName]; }
PrintValues(db.Entry(blogUser).CurrentValues);

clone一个对象,包括原始值或者当前值,或者当前数据库内保存值

var blogUser = db.BlogUsers.Find(4);
var clonedBlogUser = db.Entry(blogUser).GetDatabaseValues().ToObject() as BlogUser;
Console.WriteLine((clonedBlogUser.BlogName));
EF框架step by step(5)—处理实体简单属性的更多相关文章
- ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity ...
- EF Core中怎么实现自动更新实体的属性值到数据库
我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...
- 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来EF框架生成ADO.net实体模型的话,不利于修改. 主要是解决以下两个问题: 1.比如前端需要一个值,如果存 ...
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- EF框架step by step(8)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(3)—Code-First
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
随机推荐
- MVC4 @RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别
1. RenderBody在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.在这个页面中,会看到标签里有这样一条语句:@Rend ...
- 继承下public,protected,private访问权限
C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...
- JDK、Jmeter、Android环境变量配置
JDK环境变量 1.在系统变量里点击新建,变量名填写JAVA_HOME,变量值填写JDK的安装路径,在这里就填写"D:\Program Files\Java\jdk1.6.0_26" ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- APP消息推送:通知和透传
目前市场上的消息推送方式有两种:通知和透传.什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理.透传消息, ...
- 【转载】pyqt QTableWidget的使用
转载地址: http://blog.sina.com.cn/s/blog_9b78c91101019sgi.html QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中 ...
- CSS中设置DIV垂直居中的N种方法 兼容IE浏览器
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...
- Counterfeit Dollar -----判断12枚钱币中的一个假币
Counterfeit Dollar Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u ...
- poj 3264:Balanced Lineup(线段树,经典题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32820 Accepted: 15447 ...
- makefile基础(GNU)
makefile的核心 targets : prerequisites ; commands... //不分行的情况 targets : prerequisites ...