利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题 v4

利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题


经过 6 小时的实践和验证后,原本文章 po 出来的作法,只有在小弟特定的项目和 UT  才可以执行   ( 原因尚不明 )

小弟重新建置相同的程序和数据库后却无法重现同样的效果。

另外,虽然 很多文章在反应是 CSDL 有更新,但 SSDL 没有更新是 Bug 。

但小弟导入 StoreGeneratedPattern = Computed 后,发现若是 SSDL 也改成 Computed 的话!

EF 就会忽略该字段写入的值,所以 之后要 update 其值就也不行。 

这对某些字段是没办法接受的,因此 SSDL 没有改的话!还比较没问题。

至少可以在 DTO 对象中加上初始化值   或是 Insert 语法时避开 来解决。

若是手动改 SSDL 的话,只要重新拉 Model 或是 更新,则 SSDL 就会被更新成 None 。

ps.. 目前确定 Identity 和 TimeStamp 这两个字段型态会将 SSDL 的设成 Computed

所以,目前 EF 的 默认值 有2种做法

  1. AP 都不会读取 和 写入,就不要加入到 EF 的 Model 上,就可以解决 insert 问题 ( 就是不要出现在 CSDL 中)
  2. AP 会读写,请直接在 POCO 上直接加上 默认值。 ( 可以的话用 Nullable 或是 类型? )

直到 L 问起时才发现原来有这样子的问题

( 感谢 R 协助 )

 

问题是若数据库有“默认值”的情况时, EF  就没有办法写入

 

当时 L 找到的解法只就以下两种,不管是那一种都很不方便

一、改写 SSDL ( EDMX 档 )   ( 这个只要做一次数据库同步后,刚刚改的就会不见了 )

二、该字段每次都填值进去  ( 程序塞值进去就不叫做 默认值了 )

 

这个问题在各讨论版都有出现过了workaround 的方式

 

其实,有另外的做法可以解决这个问题!!!

 

 

一开始小弟都没有注意到大概是因为,小弟在第一时间就已经改写成 POCO 型式的关系

之前有 po 过 EF 4 改写 POCO 自动产生 POCO 对象 的文章,有兴趣的可以参考

 

----------  请特别注意!  ----------------

v2

自订工具“一定”要是空的喔!不然 Entity Framework 不会和 POCO 整合

不然等会更新 EDMX 的时候还是没效果!!

image  

-------------------------------------------------

 

为了证明是真的 ( 有图有真相 )

所以我们就从建置 DB 开始吧!!

 

image  
当然改 DB 要从 DB Project 开始,所有的修改都要纳入版本管控,通常默认值都是不可为 null 的。
而且为了验证多种不同的默认值,这里特地加上了 TimeStamp 和 DateTime

 

image
建立默认条件!

 

image

image  
因为,TimeStamp 类型本身已经会产生值了,所以在这里只要补上 CreateDate 的就好! 

 

都改好后就同步一份到 测试数据库吧!!

 

Tip:若是您想要让数据可以依 新增、修改 都会有最新的时间记录的话。建议直接使用 TimeStamp就可以了,不需要另外再用程序去维护其最新的值。可以省下非常非常多的工

 

image
直接开始 EDMX 并同步一份最新的到模型上

image   

  image
确认一下 CreateDate 的属性,的确 StoreGeneratedPattern 是 Computed ! ( 先声明,我没有去改 SSDL )

那~~ 另外一个字段 TimeStamp 去那了? 因为 TimeStamp 我的程序都不会去动到,所以刚刚我先删除了。

 

 

---------------------------------------------------

v3

现在我重新建置却一直都是 None 可能是因为当时不小心点到了吧!很囧

不过,重新再进行验证后,其实发现 StoreGeneratedPattern 有没有设定都没关系!

( 之前都有先入为主的观念 Orz )

目前知道会自动产生StoreGeneratedPattern 只有 Identity 和 TimeStamp 两种格式

 

v2

若是原来就已经有这个字段的话!那么 StoreGeneratedPattern 就会用原来旧的

请重新建立 或是 手动改成正确的就行了!

---------------------------------------------------

 

image  
因为模型上已经有了,所以 DTO 对象也要加上该对应字段。不然会无法正常执行 
 

( 到目前为止只要加上这一行 code 就好,其他的都先不用动。 )

 

改好后就要验证,刚刚新增的字段是否会对“即有”程序造成影响

当然用单元测试来跑,马上就可以确认了。 (  快速又简单 )

 

image  
因为是默认值验证,所以就直接拿原本的 UnitTest 连改都不需要
可以看到测试中只有用到 .Name 的属性 (字段) 

 

image  
太棒了!很快地~~ 测试通过了。

 

  image
因为这段程序会自动产生三个默认值,所以也一并确认数据库的内容,都可以看到 TimeStamp 和 CreateDate 都有默认值。

v3:为了有图有真像,还是稍微把过程中断将图抓出来。

 

 

所以证明当 Entity Framework 4 + POCO 的组合时,默认值的问题是完全不会受到影响的。

而且再也不需要担心同步数据库后,修改 SSDL 后会被改回去。

原文:大专栏  利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题 v4


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11496669.html
今日推荐