我在一个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模板的一些修改。