Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF REST服务中使用EF-SerializationException_C#_Entity Framework_Rest_Wcf - Fatal编程技术网

C# 在WCF REST服务中使用EF-SerializationException

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&

引发异常: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; }
    }
公共类上下文: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。更多的编码,但可能比继续在类中使用整个实体更好的解决方案。