绕过成员名称不能与其封闭类型相同

时间:2012-05-23 05:13:06

标签: .net visual-studio-2010 dynamics-crm-2011 odata

类似于:member names cannot be the same as their enclosing type,除了我无法更改元数据,我想完全忽略该类。

我正在尝试在Visual Studio 2010中添加服务引用,但是我收到以下错误。

  

自定义工具'DataServiceClientGenerator'失败。数据服务   客户端代码生成失败:指定的模式无效。错误:   (0,0):错误0042:名称foo不能在类型中使用   Microsoft.Crm.Sdk.Data.Services.foo。会员名不能成为   与它们的封闭类型相同..

我理解这个错误是因为有人在对象foo中命名了一个字段foo,但我无法改变它...

因此,如果无法在CRM中进行任何更改,我该如何生成服务参考?

我想过下载$metadata然后删除有问题的类型然后保存它(因为类型不是我将要使用的类型)。但我不知道如何让它发挥作用,因为它并不是过于直接。

我尝试使用C#和VB.NET制作服务引用并且都没有工作,理想情况下它将是一个适用于两者的解决方案,但此时我会接受只适用于其中一个的解决方案

2 个答案:

答案 0 :(得分:6)

我已经弄清楚如何解决这个问题。

http://localhost/myWcfDataService.svc/$metadata

将此结果保存到c:\metadata.csdl

等磁盘

然后手动编辑文件并删除(或重命名)有问题的字段(这将导致它无法在您的服务中使用,但它优于整个服务无效)。

然后运行以下命令:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\DataSvcUtil.exe /language:CSharp /in:c:\metadata.csdl /out:c:\serviceReference1.cs

现在将新生成的serviceReference1.cs文件添加到visual studio项目中,查找继承自System.Data.Services.Client.DataServiceContext的类,这是您的服务入口点。

可以找到更多信息here

答案 1 :(得分:0)

感谢Seph,我提出了一些改进的方法来添加实际的引用,而不是简单的.cs文件:

  • 将您的http://localhost/myWcfDataService.svc/$metadata保存为文件,例如。 myService.csdl
  • 编辑它以手动解决names cannot be the same as their enclosing type。当类具有相同名称的字段时会导致它。我决定重命名课程,例如。从foofoo_。您可以改为重命名字段。定期运行c:\Windows\Microsoft.NET\Framework\v4.0.30319\DataSvcUtil.exe /language:CSharp /in:myService.csdl /out:serviceReference1.cs以查看何时消除所有错误。
  • myService.csdl重命名为$metadata
  • 暂时在与$metadata文件相同的文件夹中运行某个Web服务器。例如,我安装了python 3,只是从python -m http.server所在的文件夹中运行$metadata
  • 像往常一样在Visual Studio中添加服务引用,但使用临时Web服务器地址。就我而言,它是http://localhost:8000。 Visual Studio将请求/$metadata并生成所有内容。