背景

现在很流行值对象,值对象有如下特点:开发简单、使用简单和多线程安全。我试着让 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:值语义的实体如何修改?的更多相关文章

  1. go语言之进阶篇值语义和引用语义

    1.值语义和引用语义 示例: package main import "fmt" type Person struct { name string //名字 sex byte // ...

  2. 对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector

    一.对象语义与值语义 1.值语义是指对象的拷贝与原对象无关.拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝).比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,v ...

  3. C++ 性能剖析 (二):值语义 (value semantics)

    Value Semantics (值语义) 是C++的一个有趣的话题. 什么是值语义? 简单的说,所有的原始变量(primitive variables)都具有value semantics. 也可以 ...

  4. C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值

    一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...

  5. SQLServer判断指定列的默认值是否存在,并修改默认值

    SQLServer判断指定列的默认值是否存在,并修改默认值 2008年10月21日 星期二 下午 12:08 if exists(select A.name as DefaultName,B.name ...

  6. EF如何正确的进行实体中修改

    本文转载:http://www.cnblogs.com/Ruiky/archive/2012/12/29/2839011.html 不推荐方式一: 思路:先从ObjectContext取出实体,然后将 ...

  7. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_9 Mybatis中的返回值深入-解决实体类属性和数据库列名不对应的两种方式

    sql语句里面起别名的方式 测试查询的方法 数据字段 都有值了. 配置查询接口列表和实体类属性名对应关系 id可以随便起名 主键的对应 再次测试,并没有封装成功 这是应为定义的对应关系并没有使用. 当 ...

  8. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  9. EntityFrameWork实现部分字段获取和修改(含源码)

    EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的.以下介绍的2个功能点分别是部分字段更新和获取 解决部分字段Update.本方案采用仓储模 ...

随机推荐

  1. Java的Stack类实现List接口真的是个笑话吗

        今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”.   当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Ja ...

  2. 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 ...

  3. IE7、IE8下使用escape、encodeURI传递中文参数乱码的问题及解决方案

    js跳转到指定页面,一旦escape()中文数据,浏览器就会终止和没有反应.上网搜了半天始终不得解.一种说法是,escape中文之后,url中出现了%u,IE7和IE8拒绝执行.目前看来差不多是这样的 ...

  4. 借助svn进行半自动多台服务器上线部署

    传统简单保留 如果web服务器就那么几台,大致可以在测试服务器上测试好以后,直接在正式的web服务器 压缩拷贝一个,然后再覆盖下,进行简单暴力的发布. 这种纯手工发布往往会带来几个问题 压缩一不小心把 ...

  5. IF....Else循环

    在Python中最简单的循环,if......else...... if语句是判断条件是否满足条件的,如果满足条件则执行if后面的语句:否则执行else的语句. #用户输入性别,进行判断sex = i ...

  6. C# 6.0 新特性 (三)

    主构造函数 自动属性初始化表达式尤其适合与主构造函数结合使用.主构造函数为降低常见对象模式的繁琐程度提供了一种方法.此功能自五月以来已显著改进.更新包括: 主构造函数的可选实现主体:这将支持此前不受支 ...

  7. bzoj 1854 并查集 + 贪心

    思路:这个题的并查集用的好NB啊, 我们把伤害看成图上的点,武器作为边,对于一个联通块来说, 如果是一棵大小为k的树,那么这个联通块里面有k - 1个伤害能被取到,如果图上有环那么k个值都能 取到,对 ...

  8. ref:使用Dezender对zend加密后的php文件进行解密

    ref:http://www.cnblogs.com/88223100/ 使用Dezender对zend加密后的php文件进行解密   在开发中需要修改一些php文件,部分是通过zend加密的,记事本 ...

  9. POJ1284 Primitive Roots [欧拉函数,原根]

    题目传送门 Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5434   Accepted:  ...

  10. redis和mySql的数据同步的解析

    1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...