如何使用实体框架 5.0 迭代 mvc 4 中模型内的实体?使用 linq 寻找更优雅的过程。
示例:AnimalModel 可能有 Cat、Dog、Pig 实体。我如何只检测实体并忽略 AnimalModel 中的其他属性,例如 isHarry、Name、isWalking、isJumping。有没有办法在不使用反射的情况下做到这一点,EF5 中允许只查看非空实体值的东西。
我对这项技术感兴趣的主要原因是减少代码膨胀并对所有实体和子实体的数据执行通用 CRUD 操作。
可能的参考:链接
如何使用实体框架 5.0 迭代 mvc 4 中模型内的实体?使用 linq 寻找更优雅的过程。
示例:AnimalModel 可能有 Cat、Dog、Pig 实体。我如何只检测实体并忽略 AnimalModel 中的其他属性,例如 isHarry、Name、isWalking、isJumping。有没有办法在不使用反射的情况下做到这一点,EF5 中允许只查看非空实体值的东西。
我对这项技术感兴趣的主要原因是减少代码膨胀并对所有实体和子实体的数据执行通用 CRUD 操作。
可能的参考:链接
我完全看不出如何在不使用反射的情况下实现这一目标。
您可以尝试以下操作:获取托管它们的程序集中的所有 EF 类型,例如
var types = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == "NamespaceWhereEFEntitiesLive"
select t;
您可能需要对上述查询进行一些操作,但您明白了。
然后,您可以遍历 AnimalModel 的属性,检查该属性是否属于types
. 例如
foreach(var prop in AnimalModelProperties) {
if (types.Contains(prop.GetType())
}
请注意,上面的 for 循环有点猜测,但伪代码应该澄清我要解释的内容。
当您使用 EF 插入/更新时,它会自动导入所有不相关的属性。如果您想要一个从现有对象中获取属性,然后将它们应用于数据库的实现,您可以使用相对较新的upsert。
如果您想要一种自定义方式来更新对象图...
如果您使用数据库优先或模型优先(如果您有 EDMX),则可以使用T4 模板生成执行此操作的代码。
如果您希望这种技术支持导航属性,您将需要某种假设来防止循环,例如从一对多更新,而不是相反,也不是多对多属性,或者使用 EDMX 的可选描述来放置提示访问哪些导航属性。
然而,使用反射是一种更简单的解决方案,但是,即使使用反射,您也需要决定走哪条路(例如使用属性(您可以通过上述假设/技巧让 T4 添加))。
或者,您可以将此技术(我编写的)转换为与 EF 一起使用,从而在使用代码中明确指定在图中访问的位置,(使用dbset.SaveNavigation(graph, listOfPropertyPaths)
而不是编写复杂的代码来假设您在编写时希望它执行的操作dbset.Save(graph)
(我过去成功地这样做了,但还没有上传)。
另请参阅我最近发现的这篇相关文章(我还没有尝试过)。
顺便说一句,空属性确实对更新数据库很重要,通常,您不想忽略它们。