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

Pix*_*use 1 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 7

可能是框架正在推断预期的操作,因为您在函数名称(CreateSharePointFolder)前面加上了"Create"一词.可以在此处找到此行为的详细信息

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

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

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

要使RIA WCF服务能够使用您自己的方法正常工作,您需要确保参数列表中存在的所有实体至少有一个成员在其元数据类中定义了[Key]属性,并且该实体在某处返回您的DomainService采用"Get"方法.

HTH

背风处