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.本方案采用仓储模 ...
随机推荐
- hive学习(八)hive优化
Hive 优化 1.核心思想: 把Hive SQL 当做Mapreduce程序去优化 以下SQL不会转为Mapreduce来执行 select仅查询本表字段 where仅对本表字段做条件过滤 Ex ...
- beego学习笔记(4):开发文档阅读(4)
beego.Run() 这个运行后, 1)解析配置文件,也就是conf目录下的. 2)判断是否开启session,并作相应的工作 3)执行用户的hookfunc. 4)是否编译模板 5)是否开启文档功 ...
- ASPLOS'17论文导读——SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing
今年去参加了ASPLOS 2017大会,这个会议总体来说我感觉偏系统和偏软一点,涉及硬件的相对少一些,对我这个喜欢算法以及硬件架构的菜鸟来说并不算非常契合.中间记录了几篇相对比较有趣的paper,今天 ...
- appium+python自动化39-adb shell输入中文(ADBKeyBoard)
前言 上一篇提到"adb shell input textyoyo" 可以通过adb 输入英文的文本,由于不支持unicode编码,所以无法输入中文,github上有个国外的大神写 ...
- 如何在获取celery中的任务执行情况
开始以为在flower中获取,原来flower也是从celery中获取的. 如果直接用celery命令,一直会提示拒绝连接. 网上说了,用django命令就可以的. 于是试了下,OK了. 这样,至少可 ...
- SGU 206. Roads
206. Roads time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output: sta ...
- python collection系列
collection系列 不常用功能,需要进行模块功能导入: import collection Counter 常用方法测试: #!/usr/local/env python3 ''' Author ...
- Java 中如何计算两个字符串时间之间的时间差?(单位为分钟)
Java 中如何计算两个字符串时间之间的时间差?(单位为分钟) import java.text.DateFormat; import java.text.ParseException; import ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- Python函数-闭包的概念
一个函数和它的环境变量合在一起,就构成了一个闭包(closure).在Python中,所谓的闭包是一个包含有环境变量取值的函数对象.环境变量取值被保存在函数对象的__closure__属性中.比如下面 ...