イテレータを使用する NHibernate で読み取り専用プロパティをマップすることは可能ですか (つまり、yield return)?
たとえばPerson
、読み取り専用IEnumerable<Cat> Cats
プロパティを持つクラスとGetNextCat()
、シーケンス内の次の猫を取得するメソッドが呼び出されたとします。
可能なマッピングは次のとおりです。
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
HasMany(x => x.Cats).Access.ReadOnly(); // also tried .AsSet() and .AsBag()
}
}
そして、IEnumerable<Cat> Cats
プロパティの 2 つの可能な実装を次に示します。
// fails:
// System.InvalidCastException: Unable to cast object of type '<get_Cats>d__0' to
// type 'System.Collections.Generic.ICollection`1[MyProject.Cat]'.
public virtual IEnumerable<Cat> Cats
{
get
{
var cat = GetNextCat();
while(cat != null)
{
yield return cat;
cat = GetNextCat();
}
yield break;
}
}
// works
public virtual IEnumerable<Cat> Cats
{
get
{
var catList = new List<Cat>();
var cat = GetNextCat();
while(cat != null)
{
catList.Add(cat);
cat = GetNextCat();
}
return catList;
}
}
プロパティの両方のバージョンで同じ結果が生成されます。では、NHibernate が最初の例では機能しないのに、2 番目の例では機能するのはなぜでしょうか? NHibernate が からコンパイラによって生成されたクラスを処理するように設定されていないということyield return
ですか? それとも、これは Fluent だけの問題ですか?