【问题标题】:Using EF in WCF REST service - SerializationException在 WCF REST 服务中使用 EF - SerializationException
【发布时间】:2017-01-17 16:29:45
【问题描述】:

抛出异常:System.Runtime.Serialization.dll 中的“System.Runtime.Serialization.SerializationException”

这是我得到的错误,当我尝试使用 EF 从 DB 获取 FK 数据时。

这是我的上下文类:

public class Context : DbContext
{

        public DbSet<TypeCar> TypeCarList { get; set; }

        public DbSet<Car> CarList{ get; set; }
}


    [DataContract]
    public class TypeCar
    {
        [DataMember]
        [Key]
        public int TypeCarId{ get; set; }
        [DataMember]
        public string typeName{ get; set; }

    }

    [DataContract]
    public class Car
    {
        [DataMember]
        [Key]
        public int CarId { get; set; }
        [DataMember]
        public string carName{ get; set; }
        [DataMember]
        public virtual TypeCar FK_Car{ get; set; }
    }

这是我的 IService 接口:

public interface IService1
{

    [OperationContract]
    [WebInvoke(Method = "GET", UriTemplate = "getCars",
      RequestFormat = WebMessageFormat.Json,
      ResponseFormat = WebMessageFormat.Json,
      BodyStyle = WebMessageBodyStyle.Bare)]
    List<Car> getCars();

    [OperationContract]
    [WebInvoke(Method = "GET", UriTemplate = "getTypeCars",
      RequestFormat = WebMessageFormat.Json,
      ResponseFormat = WebMessageFormat.Json,
      BodyStyle = WebMessageBodyStyle.Bare)]
    List<TypeCar> getTypeCars();


}

这是我的 Service1 类:

public class Service1 : IService1
{


    public List<Avtomobil> getCars()
    {
        using (var db = new Context())
        {
            return db.CarList.ToList();
        }
    }
    public List<TypeCar> getTypeCars()
    {
        using (var db = new Context())
        {
            return db.TypeCarList.ToList();
        }
    }
}

当我调用 REST 方法 getTypeCars 时,它会正常工作。但是当我调用 getCars 方法(使用 FK)时,它会抛出给定的异常(序列化异常)。我对其他实体进行了相同的尝试,但始终相同(调用具有 FK 的实体时例外)。

编辑: 如果我从属性 FK_TypeCar 中删除“虚拟”字,则不会抛出异常,但 FK_TypeCar 的值为 null。

【问题讨论】:

  • 你试过在类的顶部设置[Serializable]吗?
  • 我做了,还是一样。
  • @Tadej 我不会将实体用于 json。它们被序列化了,对象图可能很长。请改用 Dtos。对于您的问题:我猜,wcf 尝试访问 FK_Car,但您的上下文已经关闭。尝试在之前获取FK_Car
  • mm 抱歉,我没有在 REST 模式下使用太多 WCF(我建议您改为使用 WebAPI).. 但是当它尝试在 JSON 中序列化查询时,请确保问题不是参考循环实体
  • 我只能推荐使用 Dtos 而不是实体。在 wcf 中使用实体是一个非常糟糕的主意。

标签: c# entity-framework rest wcf


【解决方案1】:

@Rabban 是正确的 - 您应该使用单独的对象通过 EF 返回数据,然后将它们转换为您的 DataContract 对象。以下是众多原因之一:

目前,您已在 Car 上为 TypeCar 创建了具有 virtual 属性的 EF 实体,但在 TypeCar 中没有对应的 ICollection&lt;Car&gt; 用于返回到 Car 的一对多关系。因此,没有完全描述这种关系。如果您要这样做,那么 WCF DataContractJsonSerializer 无论如何都会因为循环引用而引发 SerializationException。因此,为了使 EF 实体能够完全描述您的基础架构并使您能够通过 WCF 将对象传回,您必须创建单独的 DTO。

【讨论】:

  • 谢谢。我决定使用 DTO。更多的编码,但可能比在课堂上继续使用整个实体更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2013-07-08
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多