5

DataContractJsonSerializerクラスを使用してオブジェクトのリストをjson形式に出力しようとしていますが、次のエラーが発生します。カスタムクラスに別のカスタムクラスが含まれていると、DataContractResolver/KnownTypeの問題が発生する

Type 'Castle.Proxies.JokeCategoryProxy' with data contract name 
'JokeCategoryProxy:http://schemas.datacontract.org/2004/07/Castle.Proxies' 
is not expected. Consider using a DataContractResolver or add any types not 
known statically to the list of known types - for example, by using the 
KnownTypeAttribute attribute or by adding them to the list of known 
types passed to DataContractSerializer. 

私は、これは以前に回答されている知っているが、それだけで私のオブジェクトAには、別のカスタムオブジェクトでプロパティを持っている場合に発生するようです。

[DataContract] 
[KnownType(typeof(ModelBase<int>))] 
public class Joke : ModelBase<int> 
{ 
    [DataMember] 
    public virtual string JokeText { get; set; } 

    [DataMember] 
    public virtual JokeCategory JokeCategory { get; set; } 
} 

[DataContract] 
[KnownType(typeof(ModelBase<int>))] 
public class JokeCategory : ModelBase<int> 
{ 
    [DataMember] 
    public virtual string Name { get; set; } 
} 

あなたは私がジョークカテゴリを削除して、解決策ではなく、私は希望として理想的なものが、単純に、エラーが消えINT(JokeCategoryId)を持っている場合はジョークモデルは、ジョークカテゴリオブジェクトが含まれて見ることができるように再度照会することなくカテゴリを利用できるようにする。以下は

は、私が一番私を混乱させるしてもエラーがCastle.Proxies.JokeCategoryProxy(これは?!から来た)

を参照することで、JSON

public static ContentResult JsonResponse<TReturnType>(this Controller controller, TReturnType data) 
    { 
     using (var oStream = new System.IO.MemoryStream()) 
     { 
      new DataContractJsonSerializer(typeof(TReturnType)).WriteObject(oStream, data); 

      return new ContentResult 
      { 
       ContentType = "application/json", 
       Content = Encoding.UTF8.GetString(oStream.ToArray()), 
       ContentEncoding = Encoding.UTF8 
      }; 
     } 
    } 

を生成するために使用しているコードです。

何か提案がありますか?

答えて

5

nHibernateは、特に指定しない限り、すべてのプロパティが遅延ロードされていることを前提としています。
あなたの場合、Jokeオブジェクトを引き出すたびにJokeCategoryがDBから引き出されないことを意味します。代わりに、「プロキシ」が動的に生成されます。
初めてこのプロパティにアクセスすると、nHibernateはDBからそのプロパティを取得することがわかります。

だから、基本的には、ここで何が起こっているのか、あなたのJokeCategoryがタイプJokeCategoryであることを期待していることである(これはnHibの遅延ロードの作品がどのようである)、それはないので、本当にそれがタイプProxy...のですinitialized-。

(これは単なる簡単な説明である。nHibにいくつかのより多くをGoogleとそれをより知るためにどのように動作するかあなたも、このORMに大きな導入のためsummer of nhibernateをチェックアウトすることができます。)

そして、あなたの質問に:あなたがここにオプションのカップルがあります:非怠惰など

  1. のconfigureあなたCategoryプロパティ、適切なオブジェクト・タイプでそれを初期化するためにNHibernateはを強制します

  2. (はるかに望ましい、私の意見で)ドンあなたのModelエンティティをシリアライズしないでください。代わりに、あなたのプレゼンテーション層が必要とする情報を保持する何らかのDTOを構築してください。
    ドメインモデルの変更によってプレゼンテーションが影響を受ける必要はなく、その逆もあります。
    また、複数のモデルエンティティに関連していても、DTOに必要なすべての情報を保持できます。例えば

public class JokeDTO 
    { 
     public int JokeId; 
     /*more Joke properties*/ 
     public int JokeCategoryId; 
     public string JokeCategoryName; 
     /*etc, etc..*/ 
    } 
+0

非常に有用なものをsJhonny。現時点では私はDTOには進まないが、将来の発展のためにそれらを覚えておく。私の流暢なnhibernateマッピングファイルで.Not.LazyLoad()を使用すると、問題が直ちに解決されました。どうもありがとうございました。 – JConstantine

関連する問題