.net Translate:避免列映射错误
我已经开始将旧的ADO.NET代码移植到Linq到实体。一个特别有用的函数是及其配套函数,它允许您使用任意SQL并将它们展开为普通的旧数据对象 但是,在列映射中很容易出错:错误的列名或不同的大小写会导致.NET属性与预期的SQL列不再匹配。当DB模式发生变化时,这一点尤其难以检测。当.NET属性与sql列不对应时,不会引发异常-相反,只将Linq转换为实体(.net Translate:避免列映射错误,.net,entity-framework,.net,Entity Framework,我已经开始将旧的ADO.NET代码移植到Linq到实体。一个特别有用的函数是及其配套函数,它允许您使用任意SQL并将它们展开为普通的旧数据对象 但是,在列映射中很容易出错:错误的列名或不同的大小写会导致.NET属性与预期的SQL列不再匹配。当DB模式发生变化时,这一点尤其难以检测。当.NET属性与sql列不对应时,不会引发异常-相反,只将Linq转换为实体(null,0,等等)。这种行为可能偶尔有用,允许类型包含额外的属性,但它也非常擅长隐藏错误,特别是当null或默认值是该列的有效值时 是否有
null
,0
,等等)。这种行为可能偶尔有用,允许类型包含额外的属性,但它也非常擅长隐藏错误,特别是当null
或默认值是该列的有效值时
是否有任何方法可以改变这种行为,或者至少可以检测到它何时发生,从而使这种错误立即变得明显
换句话说:我可以强制要求.NET对象的形状必须与SQL查询的形状完全匹配吗?不,您不能强制要求,但可以编写一组集成测试,自动验证类是否仍然具有正确的形状。对,但这相当不方便,因为它需要手动复制实体框架提供的所有优秀逻辑,以将列映射到属性;或者,更糟糕的是,实际上手动为每个查询分别编写一个测试,本质上只是为了验证是否存在这样一个小错误。是的,您必须手动编写这些测试,因为您使用的是手动编写的查询,而EF无法为您处理。集成测试正是人们用来验证手写查询的。如果您不喜欢它,请改用LINQtoEntities来避免这些错误。它只是检查DataReader中的所有列是否对应于给定类型的属性,反之亦然。然后,只需列出相关的查询(在我的例子中,反射也是可能的),并进行一次简单的测试。这比让EF为您进行验证要复杂得多,但比维护我的数据结构的另一个样板表示要简单得多。因此,将其作为一个答案。它可以帮助其他人。对于每个层次结构类型的表,Translate完全失败,所以它毫无用处。