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的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
随机推荐
- 阿里云服务器 && 如何window链接到阿里云服务器
现在的时间是:2016年10月11日 1:购买学生机 阿里云手机app上 -> 学生专区 -> 购买: 需要注意的是:如果没有自己需要的系统,比如没有linux操作系统的ecs,那 ...
- Makefile_:=与=的区别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y ...
- sdut 2445 小学数学
小学数学 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
- HDU2296 Ring(AC自动机 DP)
dp[i][j]表示行走i步到达j的最大值,dps[i][j]表示对应的串 状态转移方程如下: dp[i][chi[j][k]] = min(dp[i - 1][j] + sum[chi[j][k]] ...
- POJ2762 Going from u to v or from v to u(单连通 缩点)
判断图是否单连通,先用强连通分图处理,再拓扑排序,需注意: 符合要求的不一定是链拓扑排序列结果唯一,即在队列中的元素始终只有一个 #include<cstdio> #include< ...
- Win10 资源文件
ResourceLoader rl = new ResourceLoader(); DisOutText.Text = rl.GetString("Display"); Resou ...
- 解决phpcms V9 推荐位无法排序
/phpcms/modules/content/content.php 454行 /** * 排序 */public function listorder() { if(isset($_GET['do ...
- WPF实现TextBox水印效果
在日常项目中,一个TextBox需要输入用户名,我们通常的做法是先用一个TextBlock来说明,例如下面的截图: 今天将使用另外一种方式来展示,使用水印的方式.请参考下面的代码: <Windo ...
- ARM寄存器学习,王明学learn
ARM寄存器学习 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式. ...
- 解决Android解析图片的OOM问题!!!(转)
大家好,今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候 就要用BitmapFa ...