如何设置函数的返回类型导入到其他edmx文件中定义的对象?

时间:2011-09-07 09:39:11

标签: entity-framework entity-framework-4 edmx

我在一个edmx1文件中有FunctionImport,我想将ReturnType设置为位于其他edmx2文件中的对象。

例如,我有edmx1文件,其中包含以下FunctionImport和edmx1文件中定义的t_Page对象

edmx1

<FunctionImport Name="CopySite" EntitySet="t_Page" ReturnType="Collection(Entities.t_Page)">
       <Parameter Name="assemblyId" Mode="In" Type="Int32" />
       <Parameter Name="projectId" Mode="In" Type="Int32" />
</FunctionImport>

现在,我想更改ReturnType,因此它将返回c_Page(在edxm2中声明)而不是t_Page。如果我只是在edmx1中将t_Page更改为c_Page,我会收到错误c_Page未在edmx中定义

<FunctionImport Name="CopySite" EntitySet="c_Page" ReturnType="Collection(Entities.c_Page)">
       <Parameter Name="assemblyId" Mode="In" Type="Int32" />
       <Parameter Name="projectId" Mode="In" Type="Int32" />
</FunctionImport>

我怎么能这样做?

已更新

我需要这个的原因是: 我有几个具有不同表的DB,除了其中5个具有相同方案但每个DB中具有不同名称的表(例如c_Page,d_Page,e_Page ...)。它必须有不同的名字!现在,当我为每个数据库创建edmx时,我不想拥有数百个“相同”类,因为它们都具有相同的方案但名称不同,所以我希望将相同的类映射到所有这些表

也许我需要实体框架4“代码优先”?但是这样我需要手动创建类,对吧?

你能建议我怎么做吗?

1 个答案:

答案 0 :(得分:0)

这通常是不可能的。您只能使用在同一EDMX文件中定义的类型。

this article中描述了唯一可以实现此目的的情况,您可以在其中包含一个CSDL文件。这将允许您在一个CSDL文件中定义实体,并将该CSDL文件包含在第二个EDMX中,您可以在其中定义FunctionImport,并希望也使用该实体(我没有测试过它)。但它有一些后果:

  • 只能以这种方式划分CSDL文件
  • 您仍然需要单个共享MSL和SSDL文件用于两个CSDL文件
  • 您不能再使用EDMX(这些文件的容器)
  • 您无法使用设计师及相关的自动化工具和向导

编辑:

因此,根据您的编辑,您必须在每个EDMX中定义实体 - 如何避免这种情况。如果确保每个EDMX中的实体完全相同(包括:名称,键,属性名称,关系),则可以修改用于生成类的T4模板,以便只生成一个模板。之后,您需要确保模板生成的ObjectContext派生类在其公开集中使用正确的类。这完全是关于T4模板的一些修改。