使实体框架处理具有多对多关系的视图,就像具有多对多关系的表一样

时间:2011-08-30 11:57:53

标签: views many-to-many entity-framework-4.1

我有三个我在DB中手动创建的视图。

第一个视图是“Region”,第二个是“FIPS”,最后一个是它们之间的多对多叫做“Region2FIPS”。这些都是视图,我只需要读取数据,所以我不担心有可更新的视图。

我已将每个视图添加到Entity Framework,并在它们之间创建了适当的关联。

Region to Region2FIPS是1对多。 对Region2FIPS的FIPS是1到多。

“Region2FIPS”视图只包含两列,一列称为“FIPSID”,另一列称为“RegionID”。这些列与我在上面定义的关系中的各自视图相关联。

当在DB中的表上进行这种类型的关联时,Entity Framework知道它是多对多关系,并且它在“Region”上创建了一个名为“FIPS”的导航属性,我可以用它来浏览FIPS的子集合。对于“FIPS”到“Region”也是如此。

但是,使用视图手动完成时,它不会表现出该行为。相反,我的“Region”对象有一个“Region2FIPS”对象的集合,每个对象都有一个名为“FIPS”的导航属性,类型为“FIPS”。我的“FIPS”对象有一个“Region2FIPS”对象的集合,每个对象都有一个名为“Region”的导航属性,类型为“Region”。

我认为这与我无法在视图上创建外键引用这一事实有关,因此实体框架没有实现多对多关系。但我认为,如果我手动创建视图之间的多对多关系,它将识别它并正确处理类型之间的导航。我有办法强迫它这样做吗?

1 个答案:

答案 0 :(得分:0)

这是可能的,但设计师并没有真正帮助你。你必须手动进行映射。

一种相当简单的方法是使用Code First映射。但这意味着您的模型必须首先是Code First。如果您正在编写新模型,请执行此操作。

但是,如果您正在使用数据库优先映射,则必须手动执行映射。一旦定义了视图的“主键”,您的SSDL可能就已经正确了。然后,您必须从CSDL中删除“Region2FIPS”对象(不仅仅是来自设计者!)并手动修补MSL。

最简单的方法可能是使用设计器自动映射具有类似模式的真实数据库表(而不是视图),然后使用XML编辑器将表名替换为EDMX中的视图名。

相关问题