具有shared.vb扩展名的部分实体类与使用RIA服务的客户端中的“其他”部分类无关

时间:2011-04-21 00:58:02

标签: vb.net entity-framework-4 wcf-ria-services partial-classes

我在部分类中扩展了一个Entity Framework 4实体类和一个计算属性。该成员在通过WCF RIA服务公开的客户端上不可用。

使用C#时,此问题的解决方案似乎是将部分类文件的扩展名从.cs更改为.shared.cs。我用我的VB.Net解决方案(.vb到.shared.vb)尝试了这个,并得到了一长串错误。我相信发生的事情是部分类失去了与客户端实体的关联 - 它继承自object而不是EntityObject。

我最好的猜测是,这与VB.Net处理命名空间的方式有关。每个项目都有一个“根名称空间”,它位于代码文件中定义的任何内容之前。 C#有一个'Default Namespace',它是默认情况下放置新类型的命名空间 - 通过文件中的命名空间语句。

部分类可能在其前面添加了客户端命名空间,将其放入与服务器上与之关联的实体不同的命名空间。

是否有任何扩展实体的方法可以通过WCF RIA Services和VB.Net在客户端上提供这些扩展?

1 个答案:

答案 0 :(得分:1)

此问题的解决方法取决于生成实体类的T4模板中的某些逻辑。

    If(Not String.IsNullOrEmpty(namespaceName)) Then
#>

Namespace <#=namespaceName#>

<#

实体是在项目级别定义的根名称空间内生成的,如果有的话,并且在EDMX文件中加速的命名空间内(CodeGenerationTools.VsNamespaceSuggestion方法似乎处理这个)。

在根命名空间可用的情况下,手工编码的部分类需要位于该命名空间中以匹配生成的部分类 - 它们在文件级别没有名称空间声明。当这些文件与客户端“共享”时(通过shared.vb扩展名),它们最终位于客户端的根命名空间中,而生成的实体最终位于由客户端的根命名空间和服务器根命名空间组成的命名空间中。

从服务器项目中删除根命名空间,然后在手动编码的部分类中明确声明EDMX的命名空间会导致这些共享文件和生成的权限最终在客户端的相同命名空间中(客户端的根命名空间加上EDMX的命名空间)。

注意:“ADO.Net EntityObject Generator”模板(使用EDMX设计器中的“添加代码生成的项目...”上下文菜单项添加)似乎与设计者的本机不同一。即使我在项目级别清除了根命名空间,它也没有在我的测试中生成名称空间声明。我不确定原因。