Entity Framework:继承中的烦恼

在上一篇中我介绍了edm中继承的几种方式以及是如何在查询中去操作继承的实体群。这篇随笔将诉说继承在实际应用过程中继承带给我的的困惑与烦恼。在我们的项目中有一个PickList实体 ,从它派生出的实体不下20个,PickList作为基础的参照数据 ,对其维护(CRUD)是必须的。可是在对其做维护的过程中我发现我如何知道作为base entity (PickList)他有多少个(derived entity)派生的实体,如何取得每一个实体的类型名称...,为了简单起见还是用上篇文章的模型.在这个模型中 我也选取PickList 作为本次诉说对象.Entity Framework:继承中的烦恼_第1张图片

                                                                          图1

在老大分配任务让我对 PickList做维护,我就查相关的资料。其实在平时就想过这个问题,在视图里配置EntityDataSoures时,经常看到这个场景,

Entity Framework:继承中的烦恼_第2张图片

                                 图2

我在想EntityataSources是怎么做到的,如何得到Picklist的derived Entity的EntityTypeName列表的。于是我用 Reflector工具看了一下system.web..Entity.dll,想从中得到些帮助。没有看到值得惊喜的东西,后来在entityDatasoureView(internal)中看到了EntityCSpaceType,SpaceFiteredEntityType这2个属性,才知道是通过MetaWorkSpace在访问的,可是想到底SpaceFiteredEntityType属性中的 IsTypeOrSubtypeOf()是怎样写的,却被打乱了.如是我开始了尝试通过访问MetaWorkSpace取得PickList的所有派生实体的EntityTypeName。 ,在msdn的帮助下很快我就得到了EntityTypeName的列表通过下面的代码

Code

 

解决了这一问题,我的页面显示如下,通过一个AspxCombo(devExpress 控件)回调进行过滤,这样编辑和删除很容易就可以做了。如果在Entitty data model中对PickList新增加一个派生,页面中的AspxCombo将新增一个派生的实体类型。这样做才是最符合实际,也体现出了良好的扩展性。

Entity Framework:继承中的烦恼_第3张图片

                                           图3

当然在这里我也想过其他的方式,比如说我去做一个sql视图,将数据库里的PickList表的Type类型查出来,但那种方式就必须在数据库有该种Type的数据,但是如果那样当在Entitty data model中对PickList新增加一个派生,我的维护页面就不能正确反映出来,显然这样是不可以的。但接下来真正的问题来了,如图3 我选择新增一个TypeOfRank记录,我如何在知道要创建的实体的EntityTypeName(一个变量)情况下创建一个该类型的实例呢? 似乎在EntityDataSource里面也就EntityTypeFilter是一个类似的场景的应用,可是知道这些,有什么用呢!在MSDN  forums 也提问了,没有收到帮助。没办法,只能做一个EntityTypeName匹配选择了,可是这样就显得很呆了。希望有人给些好的建议,我该如何去处理新增的问题!

你可能感兴趣的:(framework)