【发布时间】: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