利用 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 的时候还是没效果!!

?

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

?

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

所以我们就从建置 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

时间: 2024-07-28 22:29:32

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

解决android greenDAO没有默认值default value和没有原始数据类型的问题

大多数android应用开发攻城狮们对greenDAO的威名都有听过,高效,使得它在众多的orm工具中脱颖而出 最近有项目对sqlite效率有要求,所以相当了它,但是中间遇到了如题所述的两个问题 1.在greenDAO generator项目中没有相应的API能设置默认值(default value),例如: entity.addIntProperty("test").defValue("7"); 2.greenDAO generator所产生的java实体类和da

解决Entity Framework中DateTime类型字段异常

今天把一个使用了Entity Framework的程序从MySql迁移到SqlServer时,发现运行时报了一个异常: System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值. 在网上查找了一下,具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServer的datetime有效范围是1753年1月1日到9999年12月31日,如果超出这个范

解决mvc下dropdownlistfor默认值设置

http://my.oschina.net/kavensu/blog/307376 关键点在于ViewBag.XX不能与字段名同名.否则无法设置默认值.应该是因为冲突. 例如: @Html.DropDownListFor(model => model.dept_id, ViewBag.depts as IEnumerable<SelectListItem>,string.Empty, new { style = "width:180px" }) 不能写成: @Html

解决:mysql timestamp默认值0000-00-00 00:00:00 报错

一. 问题的引出 我们在用mysql5.7创建表时,如果把timestamp(时间戳)的默认值设置为0000-00-00 00:00:00 的形式,将会产生一条报错: `RepaymentDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '回款日期', 报错信息如下: [Err] 1067 - Invalid default value for 'RepaymentDate' 二. 找出原因 这个问题和mysql中sql

解决 Entity Framework 6.0 decimal 类型精度问题

?  前言 本文主要解决 EF 中对于 MSSQL 数据库的 decimal 类型经度问题,经实验该问题仅在 CodeFirst 模式的情况下发生,话不多说直接看代码. 1.   假设我们有一张 Customer 数据表,主要探究:Longitude.Latitude.LonLatSum 这三个字段. 1)   结构如下: CREATE TABLE dbo.Customer ( Id int NOT NULL,                            --客户Id Name nva

Entity FrameWork 与 NHibernate

  1 Nhibernate 展示了NHibernate在数据库和用程序之间提供了一个持久层. 应用程序自己提供ADO.NET连接,并且自行管理事务.NHibernate体系结构如图1-51所示.它体现了NHibernate如何使用数据库和配置文件数据来为应用程序提NHibernate 供持久化服务(和持久化的对象). SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是ConnectionProvider的客户.可以持有一个可选的(

Entity Framework Core Like 查询揭秘

不过Entity Framework 中默认提供了StartsWith.Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Functions.Like,今天我们来重点说说它们之间的区别. 表结构定义 在具体内容开始之前,我们先简单说明一下要使用的表结构. public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } public

Entity Framework 并发处理详解

引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都为并发控制提供好良好的支持方案.并发处理方式一般分为乐观必并发与悲观必并发两种,本文将为大家介绍 Entity Framework . LINQ to SQL 中的并发处理方式.在本文最后,将提供一个了可参考的方案,结合事务 Transaction 处理复杂性对象的并发. 目录 一.并发处理的定义

C#综合揭秘——Entity Framework 并发处理详解

引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都为并发控制提供好良好的支持方案. 并发处理方式一般分为乐观必并发与悲观必并发两种,本文将为大家介绍 Entity Framework . LINQ to SQL 中的并发处理方式.在本文最后,将提供一个了可参考的方案,结合事务 Transaction 处理复杂性对象的并发. 目录 一.并发处理的定义