【问题标题】:Silverlight Shared classes in RIA service causing build errors -The type 'X' already contains a definition for 'Y'RIA 服务中的 Silverlight 共享类导致构建错误 - 类型“X”已包含“Y”的定义
【发布时间】:2010-09-22 11:34:45
【问题描述】:

我有一个使用共享类的 Silverlight 4 应用程序。在.Web 项目中,我有一个名为“X.Shared.cs”的类。此类具有三个字符串属性。当我构建应用程序时,它给出了一条错误消息“类型'X'已经包含'Y'的定义”。 Silverlight 应用程序中生成的代码中的属性似乎被视为重复项。我已经尝试清理我的解决方案并重建,这有时会有所帮助,但完全不一致。

有没有人有过这个问题的经验?我是不是做错了什么?

共享类(X.Shared.cs)的代码如下:

public partial class VideoItem
{
    [Key]
    public String ID
    {
        get;
        set;
    }

    public String ImageURL
    {
        get;
        set;
    }

    public String URL
    {
        get;
        set;
    }
}

这是解决方案资源管理器的屏幕截图,显示了生成的共享文件:

【问题讨论】:

    标签: c# silverlight class shared


    【解决方案1】:

    为了解决这个问题,我创建了一个不包含任何属性的空白 .shared.cs 类(这显然是一个部分类)。然后,我在同一个命名空间中使用该类名创建了另一个部分类,并在这里放置了我需要访问的所有属性。

    【讨论】:

    • 很奇怪你不得不这样做。我想查明原因,因为我似乎没有这个问题。 +1 创造性思维 :)
    • 感谢您的帮助!如果您将来遇到问题,至少您可以使用此解决方案!虽然很想理解它......
    【解决方案2】:

    代码生成存在限制。为避免在共享或链接文件中生成重复成员,成员不能使用自动实现的属性。因此,要解决这个问题,您只需定义自己的 get 和 set。请记住,不让 RIA 代码生成创建成员应该有充分的理由。要让 RIA 创建成员,只需不要与客户端链接或共享您的实体,而是通过 Query 方法公开它。

    来自http://msdn.microsoft.com/en-us/library/ee707359%28VS.91%29.aspx

    避免重复成员

    在生成实体代理类时,可能已经使用部分类型在客户端项目中定义了相同的类型和成员。您可能已经在共享代码或仅存在于客户端项目中的代码中定义了成员。 RIA 服务在生成代理类之前检查现有成员。任何已定义的成员都不会在代理类中生成。 [不包括 - 实体成员不得使用自动实现的属性。从服务器到客户端项目的共享和链接文件是避免生成成员的唯一方法。]

    【讨论】:

      【解决方案3】:

      您是否检查过 X.Shared.cs 中的类定义是部分的?

      public partial class MyEntity
      {
        ...
      }
      

      【讨论】:

      • 您是否还有其他文件定义了 VideoItem?在我的 .Web 项目解决方案中,我的实体在 MyDomainService.metadata.cs 中定义。在该文件中,我的实体具有 [Key] 等。在共享中,我没有注释,并且属性是我的主要实体定义的补充。
      • 我通过创建一个空的 .shared.cs 类解决了这个问题,然后创建了另一个分部类来保存所有属性!这似乎成功了。我不明白为什么会这样 - 也许我对如何使用共享类没有正确的理解。
      【解决方案4】:

      您是否在 Silverlight 应用程序中手动添加了对 X.shared.cs 文件的引用?

      复制由通过 RIA 服务连接的 Web/客户端项目自动完成。这些文件将在您的客户端应用程序下的 hidden Generated_Code 文件夹中结束。

      打开隐藏文件,看看您是否基本上在 Silverlight 应用程序中包含两次相同的文件。

      【讨论】:

      • 我没有手动添加它,因为它应该被自动引用,因为它具有扩展名 .Shared.cs。当我打开隐藏文件时,我可以在应用程序中看到生成的代码
      • @Vixen:那将是否定的 :) 我们不得不猜测,因为没有太多事情要做。与其清理项目,不如删除所有 bin 和 obj 文件夹,然后重试(清理实际上并没有清理多少)。您的实际课程肯定没有任何问题(在此处的 RIA 库中构建良好)。
      • 感谢您的帮助。可悲的是,删除 bin 和 obj 文件夹似乎没有帮助。构建中的错误消息是:[...]\Generated_Code\Models\VideoItem.shared.cs(24,23): error CS0102: The type '[...].Services.Web.Models.VideoItem' already包含“URL”的定义。好像它首先构建生成的代码或其他东西......
      • C:\Workspace\App.MediaCenter\Dev\Integration001\Src\App.MediaCenter.Services\Generated_Code\Models\VideoItem.shared.cs(12,23):错误 CS0102:类型 ' App.MediaCenter.Services.Web.Models.VideoItem' 已经包含 'ID' C:\Workspace\App.MediaCenter\Dev\Integration001\Src\App.MediaCenter.Services\Generated_Code\App.MediaCenter.Services.Web 的定义.g.cs(422,23):(相关位置)
      • @Vixen:当这种事情发生时,我们通常会添加一个新的类或更改类名或成员名(在本例中为 URL)。有时我们永远找不到原因,而是解决它。
      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2023-03-30
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多