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