2011-01-20 7 views
2

ちょっとそこ、私は運がなくて私のコレクションにLazyLoadを無効にしようとしました...私がこれまで試したコードは次のとおりです。流暢NHibernateは+を無効LazyLoad

// Person.cs

public class Person 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual IList<Car> Cars { get; set; } 

    public Person() 
    { 
     Cars = new List<Car>(); 
    } 

    public virtual void AddCar(Car car) 
    { 
     Cars.Add(car); 
    } 
} 

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.FirstName); 
     HasMany(x => x.Cars).KeyColumn("PersonId").Cascade.AllDeleteOrphan().Not.LazyLoad(); 
     Table("Persons"); 
    } 
} 

// Car.cs

public class Car 
{ 
    public virtual int Id { get; set; } 
    public virtual string CarName { get; set; } 
    public virtual Person Person { get; set; } 
} 

public class CarMap : ClassMap<Car> 
{ 
    public CarMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.CarName); 
     HasOne(x => x.Person).Not.LazyLoad(); 
     Table("Cars"); 
    } 
} 

任意の提案ですか?

ありがとうございます!

+1

これが機能していないことをどのように知っていますか? –

+0

@Diego Mijelshon - 私はMVCアプリケーションでそれをテストしましたが、それでもPersonのCarオブジェクトを取得しています。 :) – ebb

+0

それはあなたがするように言ったものです。 'Not.LazyLoad()'は「常にすべてをロードする」という意味です。通常は悪い考えです。 –

答えて

5

遅延ロードは、車のプロパティにアクセスしたときにのみ車のコレクションが読み込まれることを意味します。だから、これをオフにすると、人を積み込むときに、常に彼のすべての車もロードされます。これが「うまくいくかどうか」を確認するには、SQLプロファイラを開き(またはNHibernate profilerの試用版を入手)、コードをデバッグします。コードをステップ実行すると、車のコレクションがすぐにロードされたかどうか、または最初にアクセスしたときのみ表示されます。

つまり、私はあなたが何か間違ったことをしたとは思わない、ちょうどそのコンセプトを誤解している。

+0

私はどのようにしてPersonオブジェクトを取得できますか? – ebb

+0

@ebbデフォルトを残すことで、これは怠惰になります。 –

+0

@Diego Mijelshon - うーん..なぜLazyloadingが悪いと呼ばれているのだろうと思っています。lazyloadingは、Entityのすべての関連エンティティをロードすることを意味すると常に考えていました。 @Doron Yaacoby、あなたは正しかった.. NHibernateプロファイラは、2つのSQL文を実際にキャッチします.1つはPersonオブジェクトを取得し、もう1つはそのPersonに関連するCarオブジェクトを取得します。 – ebb

1

Loadメソッドを使用している場合は、代わりにGetを試してください。 Loadは常にプロキシを返し、lazily iircをロードします。 SELECT N + 1に注意してください。

EDIT:他のコメントを再読した後は、おそらく予想通りに機能します。 Doronは、遅延ロードがどのように機能するのかについて既に説明しました。したがって、人と一緒にすべての車をロードしたくない場合は、遅延ロードを有効にする必要があります。レイジーローディングはデフォルトではすでに有効になっています。なぜなら、すべてのコレクションを熱心に読み込むと、前述のようにSELECT N + 1が発生するからです。つまり、人物を1つ選択し、自動車をNとする。そのような振る舞いは通常望ましくないので、私の警告:)レイジーローディングとは、明示的に要求された場合にのみコレクションがロードされることを意味します。

+0

私は.Getを使用しています。(id) – ebb

+0

どのFluentNHのバージョンを使用していますか? HasManyとNotに問題があると思われます。http://support.fluentnhibernate.org/discussions/help/251-problem-setting-notlazyload-on-onetomanycollectioninstanceを参照してください。 – Patko