2014-12-03 56 views
0

我有兩個實體填充用的ID導航集合,而不到相關實體

public class Business 
{ 
    public int BusinessId { get; set; } 
    public ICollection<Category> Categories = {get;set;} 
} 

而且

public class Category 
{ 
    [Key] 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
} 

我從我的客戶包含一個JSON其類別中的一個業務ID,並收集得到的參考身份證(有不同數量的類別,每個企業註冊一些,例如「私人教師 - 高中」,「私人教師 - 初級」等)。

我希望能夠創建業務並關聯它們,而無需首先加載相關類別實體。

我知道這是可能在一對單的導航屬性使用外鍵屬性:

//EXAMPLE OF 1-1 
public class Business 
{ 
    [ForeignKey] 
    public int CatId{ get; set; } 
    public Category cat {get;set;} 
} 

但無法找到集合導航性能的解決方案。

性能方面,這是一場災難, 在我寫的一個測試中創建了100個擁有1000個類別中的3個類別的企業接管了5秒!

 DateTime start = DateTime.Now; 
     for (int i = 0; i < 100; i++) 
     { 
      using (Model m = new Model()) 
      { 
      Business biz = new Business(); 
      biz.Categories.Add(m.Categories.Find(3)); 
      biz.Categories.Add(m.Categories.Find(5)); 
      biz.Categories.Add(m.Categories.Find(63)); 

      } 
     } 
     DateTime end = DateTime.Now; 
     Console.WriteLine(end - start); 

(使用相同的DbContext是錯誤的,只能讓我到3秒)。

我知道我可以使用一種變通方法,並存儲所有我的靜態詞典分類,並從那裏獲取,但 A.我不知道EF不會爲他們創建新實例每次 B.即使我克服A,我仍然需要一個EF解決方案來解決這個問題,這讓我想也許我不應該使用EF,並堅持舊的T-SQL和存儲過程。 也許EF無法通過任何方式與專門設計的T-SQL競爭(不是60%,而是600%)。與T-SQL相比,所有Lambadas,謂詞和LINQ都不是簡單的開發工具。

+0

我對「商業」和「類別」之間的關係有點困惑。這應該是多對多的,還是一對多的?因爲從你給它的例子看來,它是一對一的。 – IronMan84 2014-12-03 19:38:22

+0

其實它可以是,性能對兩種情況都很糟糕(今天檢查)是否有可能是我的連接或設置有問題?因爲我不相信這是EF如何反應。在其他機器上它是一樣的嗎? – MatanCo 2014-12-04 20:24:27

回答

1

我相信你在找什麼是存根實體。從本質上講,只需填寫主鍵即可在本地創建一個對象,並使用該對象代替從數據庫中提取整個事物。儘管有點舊,但看到這個blog entry。另外這個類似的SO answer

從本質上講,你將有一個像下面的代碼(但是這是一個較舊的EF version..see下文)

Category stub = new Category() {CategoryId = 3}; 
ctx.AttachTo("Categories", stub); 

biz.Categories.Add(stub); 

的AttachTo是把實體的背景下,作爲不變的,沒有添加。

但在這種情況下,ctx是一個ObjectContext。由於您使用的EF6您很可能希望使用DbSet.Attach的方法,所以你可能有更多的東西一樣

context.Categories.Attach(stub); 

老實說,雖然我不認爲我這樣做在EF6,所以我這不是正面的,這是正確的......但仍然是這個概念是一個存根實體,所以這就是你想要做的搜索。祝你好運!

+0

聽起來不錯!我會在明天答覆之前對它進行測試。我搜索了幾個小時的網絡,並沒有聽說過這種巧妙的技術。 – MatanCo 2014-12-04 20:31:50