问题1:
使用EF CodeFirst 操作现有数据库
模型定义的与 表是一样的,包含所有字段
但是有一个实际的问题
就是,这个表中有一些数据是显示出来的,还有一个部分数据,是在其他页面操作的
也就是说,不同的页面只操作这个表中的一部分字段
如果页面中,只显示操作的数据,那么更新的时候剩余的字段就全变成默认值或null了
如果数据库字段设置为not null 还会发生异常
所以我想问问。EF 在使用 saveChange()保存的时候,能否指定 只更新指定的一部分字段
当然,剩下的字段不是不能更新,而是另一个页面操作的时候才更新。。。
还是说EF saveChange()只能更新整个 entity ???
对于这个问题我自己想到的决绝办法是
<1>:难道这个时候,只能写SQL 使用 context.ExecuteSQLCommand()方法来执行么??
<2>:或者吧页面中不操作的模型的字段。全部用hidden存一下??(这样工作量不小)
求问,,求问。。。。
~~~~~~~~~~~~~~~~~~
问题2:
另一个问题,就是数据库 时间戳的问题。
以前我ADO.net 访问数据库,时间戳 在查询是 通过sql 转为 bigint
然后C#后台代码用 long存
EF读取时间戳 就变成 byte[] 字节数组了么?
那这个具体该怎么操作呢? 排他的用两个 byte[] 比较?
还有就是 entity中可定也定义这个时间戳字段啊。那么saveChange()的时候就会提示 不能更新时间戳。这个字段与第一个问题不同的就是 ,这个字段不管认识时候肯定不会通过程序更新的
这个问题 我又自己解决了,以后问问题 看来不能太着急了。
这两个问题其实是有一点相关性的。
先说第二个问题,TimeStamp字段如果使用EF,是不需要你去比较的,EF自己会处理。
如果TimeStamp有问题,保存是不会通过的。
什么叫有问题呢,在网络操作数据库时,有可能会发生一种情况如下,
A用户读数据出来是
ID: 100
Title: test
Value: 365
TimeStamp:.....
在A用户保存之前,B用户也读了这条数据,并且作了修改
ID: 100
Title: test1
Value: 366
TimeStamp:....
如果数据表中没有Timestamp字段的话,EF生成的更新SQL是很恐怖的长的,你可以自己试试:)
如果有TimeStamp字段的话,EF生成的更新语句就相对简单多了,
1、检查TimeStamp是否自己读出时的状态。
2、如果不是,保存失败。
这儿说得有点不够严谨,其实是有三个不同的策略的应对的。不过再说就太长了,观众会有意见。
为什么要这么详细解释第二个问题,是因为如果你知道了第二个问题的原因,来龙去脉,其实第一个问题通常就不会再成为问题了。
都怪我太愚钝。。。
大侠 关于第一个问题 还请明示。后生我感激不尽的。(我这里机器环境有点问题,还没来得及试验)
@算了: 不是不想回答你,其实你知道第二个问题的答案后,能够充分理解的话,第一个问题真不是问题了。
还有一个小原因是,就算是有小问题,也要知道你的提交及保存代码是怎么样写的,你应该是在这儿脑子糊涂掉了,自己把弯绕过来就行了,并不是多大的问题。
@爱编程的大叔: 其实我今天下午,才想到的。是不是咱们说拧了。
我重新说明一下(虽然问题已经解决了)
你回答是第二个问题,就是关于时间戳用于验证数据是否已经修改。这个我知道的。也理解
只是第一个问题,我的本意估计没有太准确的表达出来。
第一个问题,再说一下吧
比如数据库有个TabelA,它里面有10个字段
定义Entity的时候同样定义了所有字段
有一个画面来操作TabelA中4个字段的数据
那么我一开始使用DbContext更新数据的时候是这样写的
EFContext.TabelA.Entry( tableAEntityObj ).State = ....Modified;
EFContext.SaveChange();
但是这样的话,画面上不更新的那6个字段也会被更新
而我页面上又没有显示这6个字段的数据,所以更新的时候 传递到Action的tableAEntityObj这个参数没有这6个字段的数据(忘记说了我用MVC)所以更新后,表中整个行的数据都更新了,且这6个字段的数据肯定是不正确的。
然后,你说第二个问题弄明白,第一个问题就能明白。
我真的想了很久。。。。。。。呵呵
其实我也很喜欢你的回答方式的。能带动我多思考问题。不过哎,我真是理解能力有限。。。见谅
然后第一个问题我已经找到大按钮了,这里也贴下地址吧
http://www.cnblogs.com/dudu/archive/2011/04/02/2003923.html
也怪我了,问问题的时候没有把更详细的内容贴出来。还是谢谢了
更新的时候,是修改,不会动你其它的值的,可能是你哪里写错了 改了所有的,
那能告诉我 怎样设置或者编码 才能 只更新一个表里的一部分列的数据么?最好能给简单的demo,或者片段也好啊
@算了: 你要知道原理,它生成的时候是, 看你那个属性的状态是不是medity好像是这个 .你看一下 就是修改的单词, 如果是这个状态才生成修改的sql语句 ,也就是说如果 你 一直有问题就直接 从数据库用EF容器取出来,然后直接只改取出对象 的某些属性就可以了 在EF窗口里管理的 你改了对象的属性 会自动 改 属性的状态的
@望着天的蜗牛: 非常感谢,很热心。不过你回复的时候,帖子已经关闭了。没法给你加分了。在此仅只能表示感谢了。谢谢了