所以这就是场景:我们正在开发一个使用Silverlight 4的Web应用程序,并使用WCF RIA Services 1.0 SP1 Beta进行Web服务。我在Entity Framework Designer中有我的实体,但我正在使用稍微修改过的ADO.NET C#POCO实体生成器模板来生成类。
我想要做的是在域服务中使用以下签名的方法:
[EnableClientAccess]
public class ResultService : DomainService
{
[Invoke]
public SerializableResult CalculateResult(EntityOne e1, EntityTwo e2);
}
我通过其他服务中的查询将EntityOne和EntityTwo返回给客户端,如下所示:
[EnableClientAccess]
public class EntityOneService : DomainService
{
public IQueryable<EntityOne> GetEntityOnes();
}
[EnableClientAccess]
public class EntityOneService : DomainService
{
public IQueryable<EntityTwo> GetEntityTwos();
}
在Silverlight项目中成功生成了 类。 SerializableResult 不有一个密钥。
当我尝试编译时,我收到以下错误:“名为'CalculateResult'的操作不符合所需的签名。参数类型必须是实体或复杂类型,复杂类型的集合或其中一个预定义可序列化的类型。“
在我的研究中,我发现的最有用的信息出现在this post by Jeff Handley的评论中。
值得注意的是,彼得在评论中说:
如果我的复杂对象具有[Key]属性,我会得到'不符合所需的签名...'编译错误。当我删除这个属性时,我可以使用该对象作为Invoke操作的参数。
杰夫的回答:
这是设计的。复杂对象不能具有Key属性。如果您有一个Key,那么该类将被视为一个实体。
所以听起来似乎任何进一步的努力试图让我的方法工作将是徒劳的。但是,我想知道是否有其他人遇到过这个问题,以及他们为解决这个问题做了什么。
非常感谢!
答案 0 :(得分:8)
我有以下内容,对我有用。
namespace BusinessApplication2.Web
{
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;
[EnableClientAccess()]
public class DomainService1 : DomainService
{
public IQueryable<EntityOne> GetEntityOnes()
{
return null;
}
public IQueryable<EntityTwo> GetEntityTwos()
{
return null;
}
[Invoke]
public SerializableResult GetSerializableResult(EntityOne one, EntityTwo two)
{
return new SerializableResult() { Result = "It woooooorrrked!" };
}
}
public class EntityOne
{
[Key]
public int Id { get; set; }
}
public class EntityTwo
{
[Key]
public int Id { get; set; }
}
public class SerializableResult
{
public string Result { get; set; }
}
}
答案 1 :(得分:6)
非常感谢Jeff Handley先生和Dinesh Kulkarni先生的回答(通过Twitter)。
为了将Entity用作invoke方法中的参数,必须通过同一DomainService中存在的查询方法公开该Entity。这种限制的意图是
“每个域名服务都需要能够自立。”
通过添加两个虚拟查询方法(参见Jeff的答案中的一个例子),我能够编译我的代码。