【发布时间】:2012-02-12 15:13:15
【问题描述】:
当我运行我的服务时出现异常:
服务器在处理请求时遇到错误。异常消息是“无法序列化 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;
}
我实现了在 http://msdn.microsoft.com/en-us/library/ee705457.aspx 上给出的 ApplyDataContractResolverAttribute 类,并在 GetCosik 方法中添加了 [ApplyDataContractResolver] 注释。但是,它没有帮助。
有什么我错过的建议吗?
【问题讨论】:
-
您的服务操作 GetCosik() 中的 Cosik 看起来像您标记为数据协定的 Cosik在您的实体模型中定义并且您的服务由于某种原因试图返回。
-
如果您在ObjectContext 中使用
context.ContextOptions.LazyLoadingEnabled = false禁用延迟加载,您是否仍然会遇到同样的错误? -
你能在你的 RecipeService 类上面添加 [KnownType(Cosik)] 吗?
-
当我切换代理创建时,我没有收到错误,但检索到的 Cosik 中的难度字段为空。我可以再次查询数据库以获取正确的难度对象并自己设置难度字段。但是通过这种方式,我失去了 EF 提供的全部功能。有没有不松手的方法?我已经尝试过 [KnownType(Cosik)],但仍然遇到同样的错误。
标签: wcf serialization entity-framework-4.1 poco