2012-02-24 58 views
0

我使用LINQ作爲使用VS2010的Web應用程序項目中的ORM。我在SQL數據庫中定義了ER,並簡單地將數據庫表拖放到ORM中。轉移表與醫院表有4種不同的關係。其中一列是FK,int,不爲null。其他三個是FK,int,null。在DBML中,Transfer類與Hospital類有4個關聯。與所需Transfer.Hospital(FK,int,非null)的關聯具有以下屬性。ASP.Net中的關聯MVC2

Cardinality: OneToMany 
Child Property: True 
    Access: Public 
    Inheritance Modifier: (None) 
    Name = Transfers1 
Parent Property 
    Access: Public 
    Inheritance Modifier: (None) 
    Name: HospitalSrcOrDest 
Participating Properties: Hospital.HospitalID -> Transfer.Hospital 
Unique: False 

查看頁面使用的查看模型具有Transfer類型的Transfer屬性。 Model.Transfer.Hospital總是有一個整數值。但是,以下頁面腳本中的Model.Transfer.HospitalSrcOrDest始終爲空。不應該通過Hospital_Transfer1關聯自動檢索HospitalName?謝謝。

<%: Model.Transfer.HospitalSrcOrDest != null ? Model.Transfer.HospitalSrcOrDest.HospitalName : string.Empty%> 

回答

0

我修改了存儲庫的構造,但它並沒有任何區別。

public AppRepository() //constructor 
{ 
     // Create DataLoadOptions 
     DataLoadOptions dlo = new DataLoadOptions(); 

     // Always fetch source or destiation hospital when we get transfer 
     dlo.LoadWith<Transfer>(t => t.HospitalSrcOrDest); 

     // Set these options on the DataContext 
     db.LoadOptions = dlo; 
.... 

} 

據我所知,LINQ使用Eager Loading作爲默認值(http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/06/linq-to-sql-deferred-loading-lazy-load.aspx)。在我的View Model中,Transfer由Controller傳入。我是否應該將HospitalSrcOrDest屬性添加到視圖模型並通過導航關聯來加載該值。

public ActionResult Edit(string id) 
{ 
.... 

Transfer transfer = base.ApplicationRepository.GetTransfer(intID); 

if (transfer == null) 
    { 
    ViewData["Message"] = "There is no transfer record"; 
    return View("NotFound"); 
    } 

TransferViewModel vm = new TransferViewModel(base.ApplicationRepository, transfer, "Edit"); 

return View(vm); 
} 
0

它可能是一個懶惰的加載問題,您是否在醫院被視圖訪問之前觸發datacontext?默認情況下,L2S延遲加載關係。意思是直到該屬性被實際訪問時才從數據庫獲取它。如果您的連接在視圖訪問醫院時消失了,則可能無法檢索它。只是一個猜測。

要測試它,在您的控制器中,在執行加載/選擇後,立即嘗試訪問醫院以強制加載它。

如果你想總是渴望獲取的醫院,這裏將告訴您該怎麼做一個鏈接: http://blog.dantup.com/2009/04/eager-fetching-of-relationships-with.html

+0

我按照建議在存儲庫構造函數中設置了loadoption,但它沒有任何區別。 //創建DataLoadOptions DataLoadOptions dlo = new DataLoadOptions(); //當我們獲得帖子時總是獲取標籤 dlo.LoadWith (p => p.Tags); //在DataContext上設置這些選項 db.LoadOptions = dlo; – user266909 2012-02-25 18:23:25