使用WCF序列化POCO代理

使用WCF序列化POCO代理,wcf,serialization,entity-framework-4.1,poco,Wcf,Serialization,Entity Framework 4.1,Poco,当我运行服务时,出现异常: 服务器在处理请求时遇到错误。异常消息为“无法序列化System.Data.Entity.DynamicProxies.Cosik_14C2…”类型的参数(对于操作“GetCosik”,约定“ICosikService”),因为它不是方法签名中的确切类型“Project.Domain.Entities.Cosik”,并且不在已知类型集合中。要序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合。“。有关详细信息,请参阅服务器

当我运行服务时,出现异常:

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

我是WCF服务和实体框架的新手,非常感谢您的帮助/建议

我使用的是实体框架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;
    }
我实现了:上给出的ApplyDataContractResolvetAttribute类,并将[ApplyDataContractResolver]注释添加到GetCosik方法中。然而,这没有帮助


有什么我错过的建议吗?

不要开发自定义解析器,而是关闭代理创建。代理不适用于WCF这样的场景,因为在序列化过程中必须关闭延迟加载,并且从不使用动态更改跟踪:

context.Configuration.ProxyCreationEnabled = false;

它看起来像服务操作GetCosik()中的Cosik并且您已标记为数据协定的Cosik与实体模型中定义的Cosik以及您的服务出于某种原因试图返回的Cosik不同。如果您使用
context.ContextOptions.LazyLoadingEnabled=false
,在中禁用延迟加载,是否仍会出现相同的错误?是否可以添加[KnownType(Cosik)]在您的RecipeService类之上。当我切换代理创建时,我没有得到错误,但检索到的Cosik中的难度字段为空。我可以再次查询数据库以获得正确的难度对象,并自行设置难度字段。但这样一来,我就失去了EF提供的全部功能。有没有办法不松开它?我已经尝试过[KnownType(Cosik)],但仍然出现相同的错误。通过关闭代理创建,我的所有虚拟对象(字段)都将变为null,我失去了EF提供的功能。我想知道是否真的是这样,我必须查询数据库,以自己设置具有适当数据的虚拟字段。我浏览了很多页面,用简单的例子解释了如何使用wcf来处理简单的数据,但在现实世界中,简单的数据是相当可怕的。有人能告诉我一些资源/教程,解释如何在更复杂的数据上使用RESTWCF和EF吗?现在我使用wcf(不带rest),它可以工作,但我想学习如何以rest方式使用它您的虚拟字段为空,因为您没有使用即时加载。在您知道需要数据的情况下使用延迟加载是不正确的,因为EF必须为“每个属性”创建单独的数据库往返。@anetafr要获得更好的REST支持,请查看项目项类型“WCF数据服务”,它可以首先与代码一起使用,尽管它有自己的障碍()。就我个人而言,我会选择在我的服务层中的实体和DTO之间进行更干净的转换。无论如何,还有几个其他的选项供你考虑..动态变化跟踪从来没有在WCF中使用过?你为什么这么认为?@jannagy02:因为当实体上的属性被修改时,动态更改跟踪用于将更改通知推送到上下文。这在WCF中不起作用。当在客户端上完成更改时,您无法推送单个通知,并且当您收到服务调用时,所有更改都已应用于接收到的实体,您很可能不会修改实体的另一个附加实例上的单个属性,而只是为了重播在客户端上完成的更改。