自定义DataService命名空间和EntityContainer

时间:2013-10-11 19:55:10

标签: c#-4.0 ef-code-first wcf-data-services

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

有没有办法修改此提供者行为 a posteriori - 也就是说,不修改类名或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>

1 个答案:

答案 0 :(得分:0)

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

您可能会尝试使用namespace aliases,但我不确定这是否可以按照您的意愿使用。

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

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

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

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