Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Translate:避免列映射错误_.net_Entity Framework - Fatal编程技术网

.net Translate:避免列映射错误

.net Translate:避免列映射错误,.net,entity-framework,.net,Entity Framework,我已经开始将旧的ADO.NET代码移植到Linq到实体。一个特别有用的函数是及其配套函数,它允许您使用任意SQL并将它们展开为普通的旧数据对象 但是,在列映射中很容易出错:错误的列名或不同的大小写会导致.NET属性与预期的SQL列不再匹配。当DB模式发生变化时,这一点尤其难以检测。当.NET属性与sql列不对应时,不会引发异常-相反,只将Linq转换为实体(null,0,等等)。这种行为可能偶尔有用,允许类型包含额外的属性,但它也非常擅长隐藏错误,特别是当null或默认值是该列的有效值时 是否有

我已经开始将旧的ADO.NET代码移植到Linq到实体。一个特别有用的函数是及其配套函数,它允许您使用任意SQL并将它们展开为普通的旧数据对象

但是,在列映射中很容易出错:错误的列名或不同的大小写会导致.NET属性与预期的SQL列不再匹配。当DB模式发生变化时,这一点尤其难以检测。当.NET属性与sql列不对应时,不会引发异常-相反,只将Linq转换为实体(
null
0
,等等)。这种行为可能偶尔有用,允许类型包含额外的属性,但它也非常擅长隐藏错误,特别是当
null
或默认值是该列的有效值时

是否有任何方法可以改变这种行为,或者至少可以检测到它何时发生,从而使这种错误立即变得明显


换句话说:我可以强制要求.NET对象的形状必须与SQL查询的形状完全匹配吗?

不,您不能强制要求,但可以编写一组集成测试,自动验证类是否仍然具有正确的形状。

对,但这相当不方便,因为它需要手动复制实体框架提供的所有优秀逻辑,以将列映射到属性;或者,更糟糕的是,实际上手动为每个查询分别编写一个测试,本质上只是为了验证是否存在这样一个小错误。是的,您必须手动编写这些测试,因为您使用的是手动编写的查询,而EF无法为您处理。集成测试正是人们用来验证手写查询的。如果您不喜欢它,请改用LINQtoEntities来避免这些错误。它只是检查DataReader中的所有列是否对应于给定类型的属性,反之亦然。然后,只需列出相关的查询(在我的例子中,反射也是可能的),并进行一次简单的测试。这比让EF为您进行验证要复杂得多,但比维护我的数据结构的另一个样板表示要简单得多。因此,将其作为一个答案。它可以帮助其他人。对于每个层次结构类型的表,Translate完全失败,所以它毫无用处。