参数必须是DomainService公开的实体类型?

时间:2011-10-17 22:22:02

标签: silverlight ria

尝试在SL应用中实施域服务并收到以下错误:

域方法'CreateSharePointFolder'的参数'spFolderCreate'必须是DomainService公开的实体类型。

 [EnableClientAccess()]
public class FileUploadService : DomainService
{
    public void CreateSharePointFolder(SharePointFolderCreate spFolderCreate)
    {
        SharePointFolder spf = new SharePointFolder();
            spf.CreateFolder_ClientOM(spFolderCreate.listName, spFolderCreate.fileName);
    }

 [OperationContract]
    void CreateSharePointFolder(SharePointFolderCreate spFolderCreate);

[DataContract]
public class SharePointFolderCreate
{
    private string m_listName;
    private string m_fileName;

    [DataMember]
    public string listName
    {
        get { return m_listName; }
        set { m_listName = value; }
    }

    [DataMember]
    public string fileName
    {
        get { return m_fileName; }
        set { m_fileName = value; }
    }
}

所以我在这里错过了一些简单的方法来使这一切都有效吗?

1 个答案:

答案 0 :(得分:7)

可能是框架推断了预期的操作,因为您在函数名称(CreateSharePointFolder)前面加上了“Create”字样。可以在here

找到此行为的详细信息

虽然对于DomainServices和EntityFramework来说完全没问题,但是根据该文章中的信息,可以推断出以“删除”开头的方法将执行实体的删除,因此必须接受实体作为参数。 “创建”或“插入”前缀方法也是如此。只有“获取”或“选择”方法可以采用非实体参数,从而可以将数字ID(例如)传递给“获取”方法。

尝试暂时将您的方法名称更改为“BlahSharePointFolder”,以查看是否存在导致您出现问题的这种违规惯例。

此外,由于没有为SharePointFolderCreate DC定义元数据,您可能需要使用[MetadataType]属性修饰类(除[DataContract]属性外)。如果您使用DomainServiceClass向导并指向EF模型,您将看到如何实现此功能。底部有一个用于生成元数据的复选框。在 solution .Web项目的某个位置,您应该找到 domainservice .metadata.cs文件。在此文件中,您将找到有关如何使用[MetadataType]属性的示例。

为使RIA WCF服务能够正确使用您自己的方法,您需要确保参数列表中存在的所有实体至少有一个成员在其元数据类中定义了[Key]属性,并且该实体是通过“Get”方法返回DomainService上的某个地方。

HTH