2017-01-17 4 views
0

例外スロー: 'System.Runtime.Serialization.SerializationException' をSystem.Runtime.Serialization.dll- SerializationExceptionは

にこれは私が得たエラーで、私がしようとすると、 EFを使用してDBからFKでデータを取得します。

これは私のContextクラスである:

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(); 


} 

そして、これは私のサービス1クラスである:私は、REST方式getTypeCarsを呼び出すと

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(); 
     } 
    } 
} 

それは必要なように動作します。しかし、私がgetCarsメソッド(FK)を呼び出すと、与えられた例外(シリアライズ例外)がスローされます。私は他のエンティティと同じことを試みましたが、常に同じです(FKのエンティティが呼び出されている場合は例外です)。

EDIT: そして、私が属性FK_TypeCarから「仮想」単語を削除すると例外はスローされませんが、FK_TypeCarの値はnullです。

+0

[Serializable]をクラスの先頭に設定しようとしましたか? –

+0

私は、まだ同じでした。 – swdev95

+1

@Tadej私はjsonのためにentitesを使用しません。彼らはシリアル化され、オブジェクトグラフは非常に長くなる可能性があります。代わりにDtosを使用してください。あなたの問題:私はwcfが 'FK_Car'にアクセスしようとしますが、あなたのコンテキストはすでに閉じられていると思います。前に 'FK_Car'を取り出してみてください。 – Rabban

答えて

1

@Rabbanが正しい - あなたはEF経由でデータを返すために別々のオブジェクトを使用し、これらをDataContractオブジェクトに変換する必要があります。

現在あなたが Carに戻って1対多の関係のために TypeCarTypeCarが、該当する ICollection<Car>ため Carvirtualプロパティを使用してEFエンティティを作成している:ここでは多くの理由の一つです。したがって、関係は完全には説明されていません。 WCF DataContractJsonSerializerは循環参照のためにSerializationExceptionをスローします。したがって、基礎となるスキーマを完全に記述したEFエンティティを持ち、WCF経由でオブジェクトを戻すことができるようにするには、別々のDTOを作成する必要があります。

+0

ありがとうございます。 DTOを使うことに決めました。もう少しコーディングが必要ですが、おそらくクラス全体のエンティティを使用するよりも優れたソリューションです。 – swdev95

関連する問題