我正在开发一个动态报表生成器,它允许最终用户使用Entity Framework模型基本上创建自己的SELECT语句。让我首先描述一下我想要达到的目标:
我在考虑使用反射这样做,这似乎是一种相对简单的方法,但是存在一些限制(比如确定属性是否是外键)。我知道还有MetadataWorkspace类,但它对我来说非常混乱,以前从未使用过它。我还需要提一下,我知道潜在的参考循环,因此相关实体会有深度限制。我怎样才能创建这样的实体关系树?
其他信息
我忘了提到,我正在做的这个项目是一个可重用的库,所以它应该适用于任何dbContext,最好(如果可能的话)而不需要修改模型或添加属性。
答案 0 :(得分:0)
您的开发指南:
以下方法可以提取模型的所有类属性:
public static IEnumerable<PropertyInfo> ExtractTypeProperties(Type type)
{
return type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
}
导航属性通常为virtual
。你可以使用这样的东西来获得这些属性:
foreach (var property in typeof(MyModel).GetProperties().Where(p => p.GetGetMethod().IsVirtual)) { ... }
模型主键的名称通常为Id
,TheModelId
或用[Key]
装饰;
Id
后缀除外,或者用[ForeignKey]
修饰。请注意,导航属性也可以使用此属性进行修饰,因此我认为您必须进行复核以满足所有约定;