利用 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种做法
- AP 都不会读取 和 写入,就不要加入到 EF 的 Model 上,就可以解决 insert 问题 ( 就是不要出现在 CSDL 中)
- AP 会读写,请直接在 POCO 上直接加上 默认值。 ( 可以的话用 Nullable 或是 类型? )
直到 L 问起时才发现原来有这样子的问题
( 感谢 R 协助 )
?
问题是若数据库有“默认值”的情况时, EF? 就没有办法写入
?
当时 L 找到的解法只就以下两种,不管是那一种都很不方便
一、改写 SSDL ( EDMX 档 )?? ( 这个只要做一次数据库同步后,刚刚改的就会不见了 )
二、该字段每次都填值进去? ( 程序塞值进去就不叫做 默认值了 )
?
这个问题在各讨论版都有出现过了workaround 的方式
?
其实,有另外的做法可以解决这个问题!!!
?
?
一开始小弟都没有注意到大概是因为,小弟在第一时间就已经改写成 POCO 型式的关系
之前有 po 过 EF 4 改写 POCO 和 自动产生 POCO 对象 的文章,有兴趣的可以参考
?
----------? 请特别注意!? ----------------
v2
自订工具“一定”要是空的喔!不然 Entity Framework 不会和 POCO 整合
不然等会更新 EDMX 的时候还是没效果!!
?
-------------------------------------------------
?
为了证明是真的 ( 有图有真相 )
所以我们就从建置 DB 开始吧!!
?
?
当然改 DB 要从 DB Project 开始,所有的修改都要纳入版本管控,通常默认值都是不可为 null 的。
而且为了验证多种不同的默认值,这里特地加上了 TimeStamp 和 DateTime
?
建立默认条件!
?
?
因为,TimeStamp 类型本身已经会产生值了,所以在这里只要补上 CreateDate 的就好!?
?
都改好后就同步一份到 测试数据库吧!!
?
Tip:若是您想要让数据可以依 新增、修改 都会有最新的时间记录的话。建议直接使用 TimeStamp就可以了,不需要另外再用程序去维护其最新的值。可以省下非常非常多的工
?
直接开始 EDMX 并同步一份最新的到模型上
??
?
确认一下 CreateDate 的属性,的确 StoreGeneratedPattern 是 Computed ! ( 先声明,我没有去改 SSDL )
那~~ 另外一个字段 TimeStamp 去那了? 因为 TimeStamp 我的程序都不会去动到,所以刚刚我先删除了。
?
?
---------------------------------------------------
v3
现在我重新建置却一直都是 None 可能是因为当时不小心点到了吧!很囧
不过,重新再进行验证后,其实发现 StoreGeneratedPattern 有没有设定都没关系!
( 之前都有先入为主的观念 Orz )
目前知道会自动产生StoreGeneratedPattern 只有 Identity 和 TimeStamp 两种格式
?
v2
若是原来就已经有这个字段的话!那么 StoreGeneratedPattern 就会用原来旧的
请重新建立 或是 手动改成正确的就行了!
---------------------------------------------------
?
?
因为模型上已经有了,所以 DTO 对象也要加上该对应字段。不然会无法正常执行?
?
( 到目前为止只要加上这一行 code 就好,其他的都先不用动。 )
?
改好后就要验证,刚刚新增的字段是否会对“即有”程序造成影响
当然用单元测试来跑,马上就可以确认了。 (? 快速又简单 )
?
?
因为是默认值验证,所以就直接拿原本的 UnitTest 连改都不需要
可以看到测试中只有用到 .Name 的属性 (字段)?
?
?
太棒了!很快地~~ 测试通过了。
?
?
因为这段程序会自动产生三个默认值,所以也一并确认数据库的内容,都可以看到 TimeStamp 和 CreateDate 都有默认值。
v3:为了有图有真像,还是稍微把过程中断将图抓出来。
?
?
所以证明当 Entity Framework 4 + POCO 的组合时,默认值的问题是完全不会受到影响的。
而且再也不需要担心同步数据库后,修改 SSDL 后会被改回去。
原文:大专栏 利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题 v4
原文地址:https://www.cnblogs.com/chinatrump/p/11496669.html