使用WCF进行序列化POCO代理

时间:2012-01-17 20:07:39

标签: wcf serialization entity-framework-4.1 poco

当我运行我的服务时,我得到了例外:

服务器在处理请求时遇到错误。异常消息是'无法序列化System.Data.Entity.DynamicProxies.Cosik_14C2类型的参数...'(对于操作'GetCosik',合同'ICosikService'),因为它不是确切的类型'Project.Domain.Entities.Cosik '在方法签名中并且不在已知类型集合中。为了序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合中。有关详细信息,请参阅服务器日志。

我是WCF服务和实体框架的新手,我很感激任何帮助/建议。

我正在使用Entity Framework 4.1。使用代码优先我用两个表创建了数据库:

[DataContract(IsReference=true)]
public class Cosik
{
    [DataMember]
    public int cosikID { get; set; }

    [DataMember]
    public string title { get; set; }

    [DataMember]
    public int DifficultyID { get; set; }
    [DataMember]
    public virtual Difficulty Difficulty { get; set; }
}

[DataContract(IsReference=true)]
public class Difficulty
{
    [DataMember]
    public int DifficultyID { get; set; }

    [DataMember]
    [Required]
    public string NameToDisplay { get; set; }
}

接下来,我创建了WCF服务应用程序并使其成为RESTful。以下是界面代码:

[ServiceContract]
public interface ICosikService
{
    [OperationContract]
    [ApplyDataContractResolver]
    [WebGet(UriTemplate = "/cosik")]
    Cosik GetCosik();
}

并实施该合同

public class RecipeService : IRecipeService
{
//repository of Cosik entities - stores collection of all
//Cosik entities that can be queried from DB
private ICosikRepository cosikRepo;
...

public Cosik GetCosik()
    {
        Cosik c = cosikRepo.GetById(1);
        return c;
    }

我实现了在http://msdn.microsoft.com/en-us/library/ee705457.aspx上给出的ApplyDataContractResolverAttribute类,并在GetCosik方法中添加了[ApplyDataContractResolver]注释。但是,它没有帮助。

有什么建议我错过了吗?

1 个答案:

答案 0 :(得分:4)

而不是开发自定义解析器,而不是关闭代理创建。代理不适用于像WCF这样的场景,因为在序列化期间无论如何都必须关闭延迟加载,并且永远不会使用动态更改跟踪:

context.Configuration.ProxyCreationEnabled = false;