通过实体框架访问数据库时,我有三个可用的实体:
这些实体中的每一个都有第四个实体stt_change_log的集合。
例如,
stt_dictionary.stt_change_log = ICollection<stt_change_log>
前三个元素与stt_change_log之间的关系是
stt_change_log.element_id = (stt_dictionary | stt_concept | stt_term).id;
但是,由于stt_dictionary,stt_concept和stt_term都将 int 作为其ID类型,因此还需要以下内容:
stt_change_log.element_type_id = (7 | 8 | 9)
现在,当我运行如下所示的查询时,它会返回具有指定ID的所有stt_change_log实体,这意味着如果我想在stt_dictionary.id = 1时使用stt_change_log实体,我还会获得与stt_concept和stt_term实体相关的stt_change_log条目其ID也是1.换句话说,stt_change_log集合需要额外的过滤。
var daoDictionary = (from d in db.stt_dictionary
.Include("stt_change_log.stt_change_types")
where d.id == id
select d).FirstOrDefault();
如何通过为stt_change_log集合中的每个项目指定element_type_id属性的值来过滤stt_change_log实体?
我还要补充一点,我的意图是在一个查询中执行此操作。
答案 0 :(得分:1)
答案 1 :(得分:1)
您最好的选择是为您的日志实体使用逐层(TBH)继承映射。您将定义基本实体stt_change_log,然后为每种类型的日志派生实体类。 stt_change_type将是鉴别器。
然后,每个“主要”实体都会引用特定于该实体的日志类型,并且神奇地为您完成过滤;)
阅读以下教程以开始使用:
http://msdn.microsoft.com/en-us/data/jj618292
请注意,在您的情况下,您不需要派生实体中的任何其他属性。如果您首先使用代码,请首先搜索“按层次结构代码表”;这是一个快速准备:http://blogs.msdn.com/b/wriju/archive/2011/05/17/code-first-ef-4-1-table-per-hierarchy.aspx