C# 在WCF REST服务中使用EF-SerializationException
引发异常:System.Runtime.Serialization.dll中的“System.Runtime.Serialization.SerializationException” 这就是我在尝试使用EF从DB获取FK数据时遇到的错误 这是我的上下文类:C# 在WCF REST服务中使用EF-SerializationException,c#,entity-framework,rest,wcf,C#,Entity Framework,Rest,Wcf,引发异常:System.Runtime.Serialization.dll中的“System.Runtime.Serialization.SerializationException” 这就是我在尝试使用EF从DB获取FK数据时遇到的错误 这是我的上下文类: public class Context : DbContext { public DbSet<TypeCar> TypeCarList { get; set; } public DbSet&
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; }
}
公共类上下文:DbContext
{
公共DbSet TypeCarList{get;set;}
公共DbSet CarList{get;set;}
}
[数据合同]
公车
{
[数据成员]
[关键]
public int TypeCarId{get;set;}
[数据成员]
公共字符串类型名{get;set;}
}
[数据合同]
公车
{
[数据成员]
[关键]
public int CarId{get;set;}
[数据成员]
公共字符串carName{get;set;}
[数据成员]
公共虚拟类型车FK_车{get;set;}
}
这是我的iSeries界面:
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();
}
公共接口IService1
{
[经营合同]
[WebInvoke(Method=“GET”,UriTemplate=“getCars”,
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json,
BodyStyle=WebMessageBodyStyle.Bare)]
列出getCars();
[经营合同]
[WebInvoke(Method=“GET”,UriTemplate=“getTypeCars”,
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json,
BodyStyle=WebMessageBodyStyle.Bare)]
列出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();
}
}
}
公共类服务1:IService1
{
公共列表getCars()
{
使用(var db=new Context())
{
return db.CarList.ToList();
}
}
公共列表getTypeCars()
{
使用(var db=new Context())
{
返回db.TypeCarList.ToList();
}
}
}
当我调用REST方法getTypeCars时,它的工作方式应该是这样的。但当我调用getCars方法(使用FK)时,它抛出给定的异常(序列化异常)。我对其他实体尝试了相同的方法,但始终是相同的(调用带有FK的实体时除外)
编辑:
如果我从属性FK_TypeCar中删除“virtual”单词,则不会引发异常,但FK_TypeCar的值为null。@Rabban是正确的-您应该使用单独的对象通过EF返回数据,然后将其转换为DataContract对象。以下是原因之一:
目前,您已在
TypeCar
上为TypeCar
创建了一个virtual
属性的EF实体,但在TypeCar
中没有对应的ICollection
属性返回到Car
。因此,这种关系没有得到充分的描述。如果要这样做,那么WCF DataContractJsonSerializer将抛出SerializationException,因为循环引用。因此,为了使EF实体能够完全描述您的基础架构,并使您能够通过WCF将对象传回,您必须创建单独的DTO。您是否尝试在类的顶部设置[Serializable]?我设置了,但仍然相同。@Tadej我不会对json使用实体。它们被序列化,对象图可能很长。改用DTO。对于您的问题:我想,wcf试图访问FK_Car
,但您的上下文已完全关闭。尝试在之前获取FK_Car
。很抱歉,我没有在REST模式下使用太多WCF(我建议您改为使用WebAPI)。。但是,当它试图用JSON序列化查询实体时,请确保问题不是引用循环,我只能建议使用DTO而不是实体。在wcf中使用实体是一个非常糟糕的主意。谢谢。我决定使用DTO。更多的编码,但可能比继续在类中使用整个实体更好的解决方案。