2014-03-13 167 views
0

這是我的用戶模型或類實體框架 - 選擇特定的列

public int UserID { get; set; } 
     public string UserName { get; set; } 
     public string UserPassword { get; set; } 
     public int CompanyID { get; set; } 
     public int BranchID { get; set; } 
     public bool RecordState { get; set; } 


     public virtual Branch Branch { get; set; } 
    public virtual Company Company { get; set; } 

,這是我公司類

public int CompanyID { get; set; } 
     public string CompanyName { get; set; } 
     public string CompanyShortName { get; set; } 
     public string CompanyAddress { get; set; } 
     public string CompanyPhone { get; set; } 
     public string CompanyEmail { get; set; } 
     public string CompanyFax { get; set; } 
     public bool RecordState { get; set; } 
     public virtual List<Branch> Branches { get; set; } 
     public virtual List<Customer> Customers { get; set; } 
     public virtual List<Market> Markets { get; set; } 
     public virtual List<Seller> Sellers { get; set; } 
     public virtual List<User> Users { get; set; } 

這是我的[的WebMethod]

public User getUser(int id) 
     { 
      User user = db.Users 
       .Include(c => c.Company) 
       .Where(i => i.UserID == id) 
       .FirstOrDefault<User>(); 

      Company company = db.Companies 
       .Where(i => i.CompanyID == user.CompanyID) 
       .FirstOrDefault<Company>(); 

      company.Branches = null; 
      company.Customers = null; 
      company.Markets = null; 
      company.Sellers = null; 
      company.Branches = null; 
      company.Users = null; 

      user.Company = company; 

      return user; 
     } 

我的方法長期以來我想避免循環引用,但我認爲我的步驟不好,它需要很多步驟,我想知道我有任何爲什麼我C使用一個查詢讓公司內部的用戶公司,它也應該返回一個對象類型的用戶,因爲?我真的很抱歉我的英文不好

回答

1

所有你需要是該方法的第一行和最後一行。其餘的完全是多餘的。通過指定包含路徑,您已經獲得了公司,因此不需要單獨獲取。通過不指定任何其他包含路徑,您已經沒有獲得更多相關記錄,因此將所有這些屬性設置爲null是毫無意義的。

+0

當我剛剛使用第一行時,我得到了這個錯誤System.InvalidOperationException:生成XML文檔時發生錯誤。 ---> System.InvalidOperationException:在序列化GraduateServer.Models.User類型的對象時檢測到循環引用。 – user3367149

+0

您可能需要在EF環境中關閉延遲加載。正如另一條評論所建議的,EF設計用於延遲加載,這意味着相關實體在訪問時將被檢索。當從Web服務傳遞對象時,您確切知道您需要的相關實體,因此您應該關閉惰性加載並使用「包含調用」明確要檢索的相關記錄。創建你的DbContext後,這樣做:'context.Configuration.LazyLoadingEnabled = FALSE;' – jmcilhinney

+0

最前一頁它的關閉,第二就請寫個簡單的代碼,我想要的是,當我通過ID我想包括企業用戶照顧,但我不想得到公司的所有欄目我想選擇我想要的,對不起我的英文不好 – user3367149

0

你正在嘗試的方式太多了。我很確定你的代碼不會真正做你想做的。這是你需要的。 (我假設db是包括已經在你的類實例化的屬性或字段。)

public User getUser(int id) 
{ 
    return db.Users.Find(id); 
} 

一旦你回報用戶,你可以得到公司這樣

var user = getUser(25); 
var userCompany = user.Company; 
+0

我想要得到的相關對象在這種情況下,我在烏拉圭回合的情況下,公司意味着公司爲空 – user3367149

+0

如果公司爲空,那麼你需要進行設置,並堅持更改到數據庫。 –

+0

我認爲那是因爲你沒有設置Include this method給你相關的對象 – user3367149