如何将函数导入的ReturnType设置为其他edmx文件中定义的对象



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

例如,我有edmx1文件,在edmx1文件 中定义了以下FunctionImport和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……)。它必须有不同的名字!现在,当我为每个DB创建edmx时,我不希望有数百个"相同"的类,因为它们都具有相同的方案,但名称不同,所以我希望将相同的类映射到所有这些表

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

你能建议我怎么做吗?

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

本文描述的唯一可能的情况是,您可以将一个CSDL文件包含到另一个CSDL文件中。这将允许您在一个CSDL文件中定义实体,并将该CSDL文件包含到第二个EDMX中,在那里您将能够定义FunctionImport并希望也使用该实体(我没有测试它)。但它也有一些后果:

  • 只有CSDL文件可以这样划分
  • 对于两个CSDL文件,您仍然需要单个共享MSL和SSDL文件
  • 你不能再使用EDMX(这些文件的容器)
  • 不能使用设计器和相关的自动化工具和向导
编辑:

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

最新更新