2012-06-12 14 views
0

我的應用程序使用asp.net 4,C#和實體框架。我的數據庫包含一個表Companies,它有許多Locations,而這個表又有許多Devices。甲Company鍵接到其當前登錄。使用實體框架按約束表中的列進行過濾

我使用的網格視圖來顯示和編輯LocationsDevices單個Company的aspnet_user。這是很容易的Locations實現,因爲他們有一個直接鏈接到一個Company ...

LocationListEntityDataSource.AutoGenerateWhereClause = true; 
LocationListEntityDataSource.WhereParameters.Clear(); 
LocationListEntityDataSource.WhereParameters.Add("CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString()); 

但是我不知道如何通過Company過濾Devices,因爲他們只需要一個鏈接到一個Location。我希望用類似如下的東西,但我得到一個異常,指出Location.CompanyGuid找不到......

DeviceListEntityDataSource.AutoGenerateWhereClause = true; 
DeviceListEntityDataSource.WhereParameters.Clear(); 
DeviceListEntityDataSource.WhereParameters.Add("Location.CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString()); 

如何可以做到這一點任何想法?

+0

這個更少的實體框架問題和更多的建模/模式問題。您應該重新標記(例如,移除不相關的[tag:asp.net]並添加[tag:database-schema])並添加當前模式和實體的圖表。 –

+0

你能描述一下還是最簡單的模型?在你的情況下,爲什麼公司與地點以及設備有一對多的關係。喜歡添加設備首先創建一個位置。然後'location.Devices.Add(設備)。然後'dbconext.Companies.Add(location);' –

+0

「爲什麼公司與地點和設備之間沒有一對多的關係」 - 我假設你的意思是設備以及位置?我已經考慮過這個問題,但還有很多其他表格也與地點相關聯。爲了節省空間,我想避免將大量表格連接到公司,因爲我認爲公司可以從該位置推斷 – user1374841

回答

0

考慮公司與地點以及設備之間有一對多的關係。

當您將ICollection<Device> Devices;的虛擬屬性添加到Company class時。這將只是一個導航屬性。這不會在公司表中爲設備創建任何列。然後,您在設備模型中擁有虛擬財產公司合作伙伴和FK int CompanyId。這將只增加一個字段到Device表格,這不是太大的空間浪費。

0

我發現,設備可以通過公司進行篩選,通過使用下面的代碼手動綁定數據:

 protected void Page_Load(object sender, EventArgs e) 
     { 
      (SalesSQLEntities db = new SalesSQLEntities()) 
      { 
       // Get user ID 
       System.Guid UserID = Tools.Tools.getCompanyGuid(); 

       // Find all transactions of this company 
       var devItemList = (from dev in db.Devices 
             where dev.Location.CompanyGuid == UserID 
             select dev).ToList(); 

       DeviceList.DataSource = devItemList; 
       DeviceList.DataBind(); 
      } 
     } 

我建議,這是一個更好的設計比已經表之間建立直接聯繫間接聯繫。

較少的鏈接會導致維護更簡單,數據庫更小(可忽略)和更清晰的圖表。

有沒有異議?