2012-03-02 53 views
1

我一直推遲這個問題一段時間,但現在它一直困擾着我。我有2類(這些類automapped - 我離開了publicvirtual贅述。):如何正確綁定一個winforms控件的表?

class Cashier 
{ 
    int Id {get; set;} 
    string name{get; set;} 
    IList<Site> Sites {get; set;} 
} 

class Site 
{ 
    int Id{get; set;} 
    string name {get; set;} 
    Cashier Cashier {get; set;} 
} 

我加載收銀員這個:

sealed class Repository<T> : IRepository<T> where T :class 
    { 
     public IList<T> Items { get; private set; } 

     public void Load() 
     { 
      Items.Clear(); 
      var session = SessionHelper.GetSession(); 
      session.Clear(); 
      using (var tx = session.BeginTransaction()) 
      { 
       var list = session.Query<T>().ToList(); 

       foreach (var obj in list) 
       { 
        Items.Add((T)session.Merge(obj)); 
       } 

       session.Clear(); 
       tx.Commit(); 
      } 
     } 
//more 
} 

,並在WinForm的我把它綁定到一個BindingSource的是這樣的:

cashierBindingSource.DataSource = Cashiers; 

我設置的BindingSource作爲組合框的數據源,當我運行應用程序,並單擊除了這個組合框離子被拋出我:

初始化[HRProject.Model.Cashier#1] -failed懶洋洋地初始化角色的集合:HRProject.Model.Cashier.Sites,沒有會話或會話關閉

我發現,提供一個映射覆蓋修復此問題

mapping.HasMany(x => x.Sites).Not.LazyLoad().Cascade.All(); 

不過,我有很多這樣的班,我去有來完成這件事更清潔的方式感覺。有任何想法嗎?

+0

什麼是DisplayMember和ValueMember? – clearpath 2012-03-02 09:59:33

回答

0

以我的經驗,FNH,WinForms數據綁定和延遲加載是一個困難的組合。

如果你需要延遲加載,你需要保持一個會話在窗體的生命週期中打開。

如果你不需要它,你可以關閉它。

我發現了整個項目做到這一點,最簡單的方法是使用DefaultLazy約定:

.Conventions.Add(DefaultLazy.Never()) 

轉到"The Simplest Conventions"部分wiki上,對於這一點,和其他人的名單。

下面是來自維基名單:

Table.Is(x => x.EntityType.Name + "Table") 
PrimaryKey.Name.Is(x => "ID") 
AutoImport.Never() 
DefaultAccess.Field() 
DefaultCascade.All() 
DefaultLazy.Always() 
DynamicInsert.AlwaysTrue() 
DynamicUpdate.AlwaysTrue() 
OptimisticLock.Is(x => x.Dirty()) 
Cache.Is(x => x.AsReadOnly()) 
ForeignKey.EndsWith("ID") 

警告詞 - 一些在維基的方法名稱可能是錯誤的。我使用我可以驗證的內容編輯Wiki(即DefaultCascade和DefaultLazy),但不能爲其他人證明。但是,如果需要,您應該能夠通過Intellisense找出正確的名稱。

相關問題