EntityFramework:值语义的实体如何修改?
背景
现在很流行值对象,值对象有如下特点:开发简单、使用简单和多线程安全。我试着让 EntityFramework 中的实体保持值语义,这样的话,对值语义实体的修改就应当等于“整体替换”,好像有点问题,大家给点意见。
值语义的 OrderItem
代码
public void UpdateOrderItem(Guid productId, int quantity)
{
var item = this.OrderItemCollection.First(x => x.ProductId == productId); this.RemoveOrderItem(productId); this.AddOrderItem(item.ChangeQuantity(quantity));
}
上边的代码运行会失败,提示:主键重复,查看生成的 SQL 会发现:“先执行 insert,后执行 delete”。
局部范围的修改权限
既然没办法保持绝对的值语义,我们可以将修改的访问控制级别设置为最低:internal,看代码:
public void UpdateOrderItem(Guid productId, int quantity)
{
var item = this.OrderItemCollection.First(x => x.ProductId == productId); this.Total -= item.Subtotal;
item.ChangeQuantity(quantity);
this.Total += item.Subtotal;
}
上边代码中 ChangeQUantity 的访问级别为 internal。
备注
有好思路的朋友给点建议。
EntityFramework:值语义的实体如何修改?的更多相关文章
- go语言之进阶篇值语义和引用语义
		
1.值语义和引用语义 示例: package main import "fmt" type Person struct { name string //名字 sex byte // ...
 - 对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
		
一.对象语义与值语义 1.值语义是指对象的拷贝与原对象无关.拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝).比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,v ...
 - C++ 性能剖析 (二):值语义 (value semantics)
		
Value Semantics (值语义) 是C++的一个有趣的话题. 什么是值语义? 简单的说,所有的原始变量(primitive variables)都具有value semantics. 也可以 ...
 - C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
		
一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...
 - SQLServer判断指定列的默认值是否存在,并修改默认值
		
SQLServer判断指定列的默认值是否存在,并修改默认值 2008年10月21日 星期二 下午 12:08 if exists(select A.name as DefaultName,B.name ...
 - EF如何正确的进行实体中修改
		
本文转载:http://www.cnblogs.com/Ruiky/archive/2012/12/29/2839011.html 不推荐方式一: 思路:先从ObjectContext取出实体,然后将 ...
 - 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_9 Mybatis中的返回值深入-解决实体类属性和数据库列名不对应的两种方式
		
sql语句里面起别名的方式 测试查询的方法 数据字段 都有值了. 配置查询接口列表和实体类属性名对应关系 id可以随便起名 主键的对应 再次测试,并没有封装成功 这是应为定义的对应关系并没有使用. 当 ...
 - 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧
		
Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...
 - EntityFrameWork实现部分字段获取和修改(含源码)
		
EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的.以下介绍的2个功能点分别是部分字段更新和获取 解决部分字段Update.本方案采用仓储模 ...
 
随机推荐
- Java的Stack类实现List接口真的是个笑话吗
			
今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”. 当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Ja ...
 - CSU 1424 Qz’s Maximum All One Square
			
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1424 逐渐找到做这种题的感觉了. 二分法.g[i][j]存储坐标(i, j)的值,s[i ...
 - IE7、IE8下使用escape、encodeURI传递中文参数乱码的问题及解决方案
			
js跳转到指定页面,一旦escape()中文数据,浏览器就会终止和没有反应.上网搜了半天始终不得解.一种说法是,escape中文之后,url中出现了%u,IE7和IE8拒绝执行.目前看来差不多是这样的 ...
 - 借助svn进行半自动多台服务器上线部署
			
传统简单保留 如果web服务器就那么几台,大致可以在测试服务器上测试好以后,直接在正式的web服务器 压缩拷贝一个,然后再覆盖下,进行简单暴力的发布. 这种纯手工发布往往会带来几个问题 压缩一不小心把 ...
 - IF....Else循环
			
在Python中最简单的循环,if......else...... if语句是判断条件是否满足条件的,如果满足条件则执行if后面的语句:否则执行else的语句. #用户输入性别,进行判断sex = i ...
 - C# 6.0 新特性 (三)
			
主构造函数 自动属性初始化表达式尤其适合与主构造函数结合使用.主构造函数为降低常见对象模式的繁琐程度提供了一种方法.此功能自五月以来已显著改进.更新包括: 主构造函数的可选实现主体:这将支持此前不受支 ...
 - bzoj 1854  并查集 + 贪心
			
思路:这个题的并查集用的好NB啊, 我们把伤害看成图上的点,武器作为边,对于一个联通块来说, 如果是一棵大小为k的树,那么这个联通块里面有k - 1个伤害能被取到,如果图上有环那么k个值都能 取到,对 ...
 - ref:使用Dezender对zend加密后的php文件进行解密
			
ref:http://www.cnblogs.com/88223100/ 使用Dezender对zend加密后的php文件进行解密 在开发中需要修改一些php文件,部分是通过zend加密的,记事本 ...
 - POJ1284 Primitive Roots [欧拉函数,原根]
			
题目传送门 Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5434 Accepted: ...
 - redis和mySql的数据同步的解析
			
1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...