首页 新闻 搜索 专区 学院

Entity Framework更新数据相关的问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-09-04 13:19

问题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()的时候就会提示 不能更新时间戳。这个字段与第一个问题不同的就是 ,这个字段不管认识时候肯定不会通过程序更新的

问题补充:

这个问题 我又自己解决了,以后问问题 看来不能太着急了。

算了的主页 算了 | 初学一级 | 园豆:3
提问于:2014-09-03 17:17
< >
分享
最佳答案
0

这两个问题其实是有一点相关性的。

先说第二个问题,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、如果不是,保存失败。

这儿说得有点不够严谨,其实是有三个不同的策略的应对的。不过再说就太长了,观众会有意见。

 

为什么要这么详细解释第二个问题,是因为如果你知道了第二个问题的原因,来龙去脉,其实第一个问题通常就不会再成为问题了。

收获园豆:15
爱编程的大叔 | 高人七级 |园豆:30773 | 2014-09-03 17:27

都怪我太愚钝。。。

大侠   关于第一个问题 还请明示。后生我感激不尽的。(我这里机器环境有点问题,还没来得及试验)

算了 | 园豆:3 (初学一级) | 2014-09-04 00:06

@算了: 不是不想回答你,其实你知道第二个问题的答案后,能够充分理解的话,第一个问题真不是问题了。

还有一个小原因是,就算是有小问题,也要知道你的提交及保存代码是怎么样写的,你应该是在这儿脑子糊涂掉了,自己把弯绕过来就行了,并不是多大的问题。

爱编程的大叔 | 园豆:30773 (高人七级) | 2014-09-04 14:34

@爱编程的大叔: 其实我今天下午,才想到的。是不是咱们说拧了。

我重新说明一下(虽然问题已经解决了)

你回答是第二个问题,就是关于时间戳用于验证数据是否已经修改。这个我知道的。也理解

只是第一个问题,我的本意估计没有太准确的表达出来。

第一个问题,再说一下吧

  比如数据库有个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

  也怪我了,问问题的时候没有把更详细的内容贴出来。还是谢谢了

算了 | 园豆:3 (初学一级) | 2014-09-04 20:59
其他回答(1)
0

更新的时候,是修改,不会动你其它的值的,可能是你哪里写错了 改了所有的,

收获园豆:5
望着天的蜗牛 | 园豆:354 (菜鸟二级) | 2014-09-03 21:04

那能告诉我 怎样设置或者编码 才能 只更新一个表里的一部分列的数据么?最好能给简单的demo,或者片段也好啊

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-09-04 12:35

@算了: 你要知道原理,它生成的时候是, 看你那个属性的状态是不是medity好像是这个 .你看一下 就是修改的单词, 如果是这个状态才生成修改的sql语句 ,也就是说如果 你 一直有问题就直接 从数据库用EF容器取出来,然后直接只改取出对象 的某些属性就可以了 在EF窗口里管理的 你改了对象的属性 会自动 改 属性的状态的

支持(0) 反对(0) 望着天的蜗牛 | 园豆:354 (菜鸟二级) | 2014-09-04 12:48

@望着天的蜗牛: 非常感谢,很热心。不过你回复的时候,帖子已经关闭了。没法给你加分了。在此仅只能表示感谢了。谢谢了

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-09-04 21:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册