2016-11-13 16 views
0

Nhibernateを使用してレイジーロードされたプロパティを持つコレクションを取得していますが、Nhibernateセッションが閉じられた後にシリアライザがレイジープロパティをシリアル化しようとするときに問題を返すことがあります。それで、NHibernateに、空のままにしておくと、アンロードされた遅延コレクションがあった場合、真のリストを与えるようにする方法がありますか?例えばWeb APIから結果を返すNHibernate

IEnumerable<Store> stores = StoreService.GetList(1, 2); 

ストアは、シリアル化のエラーが発生する遅延ロードに設定されているStockItemsと1対多のマッピングを持っています。試しました

List<Store> stores_r = stores.ToList(); 

私は同じことを取得します。リストをたどって1対1の関係を取り出し、1対多の遅延ロードを無視して終了リストを返すようなものがありますか?

おかげ

編集:私が試したソリューションが、まだ

public class NHibernateContractResolver: DefaultContractResolver 
    { 
    protected override JsonContract CreateContract(Type objectType) 
    { 
     if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType) || typeof(NHibernate.Proxy.ILazyInitializer).IsAssignableFrom(objectType)) 
     { 
      var oType = objectType.GetInterfaces().FirstOrDefault(i => i.FullName.StartsWith("Navace.Models")); 
      return oType != null ? base.CreateContract(oType) : base.CreateContract(objectType.BaseType); 
     } 

     return base.CreateContract(objectType); 
    } 

    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType)) 
     { 
      return base.GetSerializableMembers(objectType.BaseType); 
     } 
     else 
     { 
      return base.GetSerializableMembers(objectType); 
     } 
    } 
} 

を働いていない手動で私は

IEnumerable<Store> stores = StoreService.GetList(1, 2); 

Store> storess = stores.ToList(); 

JsonSerializer sr = new JsonSerializer 
      { 
       ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
       ContractResolver = new NHibernateContractResolver(), 
       NullValueHandling = NullValueHandling.Ignore, 
      }; 

StringWriter stringWriter = new StringWriter(); 
JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(stringWriter); 
sr.Serialize(jsonWriter, storess); 

string res = stringWriter.ToString(); 

私が手にエラーが起こっている使用することができますので、シリアル化するために試してみてくださいは

外部例外:E 'PartProxy'の 'datedcost'から値を取得しています。

内部例外:指定された識別子とは行は[Navace.Models.Part#0]

+0

なぜ、そのプロパティのシリアル化を無視しないのですか? –

+0

私は[this](http://stackoverflow.com/questions/286721/json-net-and-nhibernate-lazy-loading-of-collections/5926718#5926718)リンクからGetSerializableMembersアプローチを試しました。私がプロキシの一致でnullを返した場合、null参照例外がスローされ、基本型が返された場合は、Type#0の行が見つかりません。 – user2119597

+0

これが役立つかどうかを見てください: - http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if-null-using-json-net –

答えて

1

私の推薦ではなく、ドメインモデルのビューモデルを返すことであるが存在します。データがあるときに空のコレクションプロパティを返すのは混乱します。ドメインモデルを(LINQ SelectまたはAutoMapperを使用して)ビューモデルに変換することにより、シリアライザはビューモデルのプロパティに触れるだけです(遅延ロードしようとします)。

関連する問題