域操作条目xxx的参数xxx必须是预定义的可序列化类型之一

时间:2013-01-15 12:10:11

标签: wcf silverlight entity-framework wcf-ria-services

我在SL5 + EF + WCF应用上遇到此网络服务错误有时

“域操作条目'AddUserPresentationModelToRole'的参数'角色'必须是预定义的可序列化类型之一。”

here是一个类似的错误,但他的解决方案对我不起作用。

我有代码生成的DomainService,它将数据库实体表示到我的客户端:

 [EnableClientAccess()]
public partial class ClientAppDomainService : LinqToEntitiesDomainService<ClientAppUserEntitlementReviewEntities>
{

    public IQueryable<Account> GetAccounts()
    {
        return this.ObjectContext.Accounts;
    }
    //..etc...

和我的自定义服务,它是表示模型和数据库实体。

[EnableClientAccess]    
[LinqToEntitiesDomainServiceDescriptionProvider(typeof(ClientAppUserEntitlementReviewEntities))]
public class UserColourService : DomainService
{

    [Update(UsingCustomMethod = true)]
    public void AddUserPresentationModelToRole(UserPresentationModel userPM, Role role, Reviewer reviewer)
    {
        ...
    }

    public IDictionary<long, byte> GetColourStatesOfUsers(IEnumerable<RBSUser> listOfUsers, string adLogin) 
    {
        //....
    }
}

和PresentationModel:

public class UserPresentationModel
    {
        [Key]
        public long UserID { get; set; }

        public byte UserStatusColour { get; set; }

        public string MessageText { get; set; }

        [Include]
        [Association("asdf", "UserID", "UserID")]
        public EntityCollection<Account> Accounts { get; set; }

        public DateTime AddedDate { get; set; }

        public Nullable<long> CostCentreID { get; set; }

        public DateTime? DeletedDate { get; set; }

        public string EmailAddress { get; set; }

        public long EmployeeID { get; set; }

        public string FirstName { get; set; }

        public Nullable<bool> IsLeaver { get; set; }

        public string LastName { get; set; }

        public DateTime LastSeenDate { get; set; }

        public string LoginDomain { get; set; }

        public string LoginName { get; set; }

        public byte WorldBuilderStatusID { get; set; }

    }

也无法让解决方案可靠地失败。似乎每当我稍微更改服务,即重新编译时,一切都会正常工作。

RIAServices unsupported types on hand-built DomainService - 似乎也在说同样的事情,用LinqToEntitiesDomainServiceDescriptionProvider修饰手工构建的服务应该可行。

1 个答案:

答案 0 :(得分:0)

可能的答案here也会在此处发布结果。

来自科林布莱尔: 我有点惊讶它曾经有效,我认为我没有看到任何人试图将额外的实体传递到命名更新之前。它可能是RIA服务中的一个错误。你想要完成什么?

注意,您的ObjectContext存在内存泄漏,因为它没有被正确处理掉。您是否有理由不使用LinqToEntitiesDomainSerivce?它将负责管理ObjectContext的生命周期。

结果:

1)这是有道理的。现在已经重构了更合理的参数(整数/字符串),并且一切正常。

2)将我的3个独立服务整合到一个服务中,该服务使用LinqToEntitiesDomainSerivce。之前我将它拆分的原因是假设使用带有PresentationModel的CustomUpdate不起作用..我不得不继承DomainService。我通过制作方法解决了这个问题:

// need this to avoid compile errors for AddUserPresentationModelToRole.. should never be called
public IQueryable<UserPresentationModel> GetUserPresentationModel()
{
    return null;
}