Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 自定义DataService命名空间和EntityContainer_C# 4.0_Ef Code First_Wcf Data Services - Fatal编程技术网

C# 4.0 自定义DataService命名空间和EntityContainer

C# 4.0 自定义DataService命名空间和EntityContainer,c#-4.0,ef-code-first,wcf-data-services,C# 4.0,Ef Code First,Wcf Data Services,简而言之:WCF数据服务的实体框架提供程序分别从DbContext的名称空间和类名中直接提取模式名称空间和EntityContainer名称。对于使用代码优先方法开发的DBContext也是如此 有没有一种方法可以在不修改类名或EDMX的情况下事后修改此提供程序行为 背景/注意事项/意见:这对于原型设计来说是一个方便的行为,但是在生产场景中,类名本身就是一个实现细节,应该对服务消费者隐藏 此外,在我的例子中,名称不能更改,因为我使用的框架提供了一个非常通用的DbContext,然后我正在编写/扩

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

有没有一种方法可以在不修改类名或EDMX的情况下事后修改此提供程序行为

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

此外,在我的例子中,名称不能更改,因为我使用的框架提供了一个非常通用的DbContext,然后我正在编写/扩展它

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

服务元数据自定义ns和自定义容器中的特定自定义点如下:

<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>

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

你可以试着玩,尽管我不确定这是否会如你所愿

在model first和database first中,查看哪一个似乎可以回答您的问题。如果没有,请告诉我

我意识到这个答案并没有太大帮助,但我想建议您为您的代码库指定适当的名称空间,即使是在生产环境中。这是因为我无法立即理解为什么在任何正常场景中都应该隐藏名称空间,但如果您不同意,请扩展您的用例

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


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

感谢您的关注。诚然,这并没有太大帮助。看起来您是按照数据库中的模式来考虑模式的,从那里可以看到不同名称的CLR和EDM模式之间的映射。然而,我正在写DataService元数据模式元素的namespace XML属性,以及如何在EDM和DataService之间生成映射。我将编辑以提供更多的具体信息。不,是的,我提到了这两个,以防万一;第一句话之后的所有内容都与DS公开的CSDL概念模式有关。问题是,如果您将WCF与EF后端一起使用,那么EF根据代码约定生成的EDM与DS使用的EDM是相同的,它们在内部进行了转换,但来源相同。因此,您确实必须使用代码约定从EF生成您想要的EDM,并且模型生成器和DS将获取该EDM以生成其CSDL。这就是为什么在两者之间可能没有映射的选择;他们是一样的。子类化真的是一个问题吗?在我的例子中,子类化是相当令人畏惧的,因为我使用的是依赖注入/存储库模式,因此我在寻找声明性解决方案。我可能被卡住了,但我会看看能不能想出什么办法。谢谢你的澄清。