1

Nutshell:WCF 数据服务的实体框架提供程序分别直接从 DbContext 的命名空间和类名中提取架构命名空间和 EntityContainer 名称。这也适用于使用代码优先方法开发的 DbContext。

有没有办法在事后修改这个提供者行为——也就是说,不修改类名或 EDM(X)?

背景/警告/意见:这是原型设计的一种方便行为,但在生产场景中,类名本身就是一个实现细节,应该对服务消费者隐藏。

此外,在我的情况下,无法更改名称,因为我使用的框架提供了一个非常通用的 DbContext,然后我正在编写/扩展它。

请注意,我不是在讨论在数据模型的 CLR 和 EDM 表示之间创建更多“空间”的方法。相反,我正在寻找一种方法来修改DataService<T>扩展本身的行为,以便内部 CLR 命名空间和 DbContext 扩展类名(保存在 EDM 中,这完全没问题)不会暴露在外部。

服务元数据中的具体定制点(custom-ns 和 custom-container 下面):

<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
    <edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
        <Schema Namespace="<custom-ns>" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityType Name="EgEntity">
                .
                .
                .
            </EntityType>
            .
            .
            .
            <EntityContainer Name="<custom-container>" m:IsDefaultEntityContainer="true">
                <EntitySet Name="EgEntity" EntityType="<custom-ns>.EgEntity" />
                .
                .
                .
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>
4

1 回答 1

0

在代码优先中,您可以使用注释指定 SSDL 中表的架构Table(查看Schema属性)。不幸的是,我认为您不能用属性或模型构建器覆盖 CSDL 中使用的模式名称空间(请注意,我没有对此进行广泛研究)。

您可以尝试使用namespace aliases,尽管我不确定这是否会如您所愿。

在模型优先和数据库优先中,请参阅这个问题,它似乎可以回答您的问题。如果没有,请告诉我。

我意识到这个答案并没有太大帮助,但我建议您为代码库指定适当的命名空间,甚至(尤其是)用于生产。这是因为我无法立即看出为什么在任何正常情况下都应“隐藏”命名空间,但如果您不同意,请扩展您的用例。

话虽如此,我同意出于其他原因应该能够将正确的 CLR 命名空间映射到不同的 EDM 模式,我想每个人都可以使用相同的名称,只要它们有意义。顺便说一句,不要忘记供应商前缀,尤其是当您将这些名称暴露给网络时。

请注意,只要上下文类未密封,第三方框架命名空间就不应相关。通常,实体被定义为 POCO,因此这通常也不是问题。因此,标准解决方案是在您自己的命名空间中扩展这个通用上下文类以及实体。

于 2013-10-15T15:17:02.717 回答