簡體   English   中英

實體框架 - 跨多個上下文在內存中緩存對象

[英]Entity Framework — caching an object in memory across multiple contexts

我正在使用Entity Framework 6和租戶隔離的應用程序。 我通過查看請求主機名來確定租戶,然后在整個應用程序中使用它,將其設置在租戶擁有的記錄中,等等。

每個上下文都在請求結束時處理。 但是,由於租戶查找非常頻繁,實際上每個主機名只執行一次,然后將對象放入內存中的只讀字典中。

這里的問題是,如果你什么都不做,你最終會得到盡可能多的重復租戶記錄(直到事情開始拋出,因為現在的模糊查詢,無論如何)。

我最初通過在我的數據存儲的構造函數中添加對DbSet.Attach()的調用並附加當前的租戶來解決這個問題。 但是,如果您同時有多個請求,則會收到異常,通知您不能將相同的對象附加到多個上下文:“IEntityChangeTracker的多個實例不能引用實體對象。” 由於我偶爾通過訪問頁面在我的開發機器上觸發這個,我無法想象它適合生產。

我嘗試通過在保存之前添加此調用來更改內容:

Context.ChangeTracker.Entries<Tenant>().Single().State = EntityState.Unchanged;

嗯,那也行不通。 我收到錯誤“無法定義兩個對象之間的關系,因為它們附加到不同的ObjectContext對象。”

好的......所以我該怎么 我所要做的就是(就最終的SQL結果而言)最終會有各種行,這些行具有對現有租戶行PK的外鍵引用。

我發現引用EF4的一些東西建議使用Detach方法,但我不確定我是不是要再調用它了,因為它現在隱藏在DbSet的公共接口之外。 如果我,我不知道在哪里。 當我第一次檢索記錄?

編輯:似乎有效的一個選項是轉到上下文並根據緩存記錄的ID提取租戶記錄。 但是,現在我要去查詢數據庫是沒有正當理由的。

緩存數據的非變更跟蹤,非實體視角會更有意義嗎? 租戶記錄似乎是外鍵關系的“指針”。

我的邏輯如下:

  • 我是否有緩存租戶信息? 沒有..去拿它並緩存它
  • 現在我需要與租戶有關的東西
    • 使用緩存的關鍵關系去做實體上下文查詢
    • 如果您確實需要租戶記錄,只需.include(“租戶”)查詢

在大多數情況下,您似乎只需要保留映射到一個或多個主機名的租戶ID。 采用舊式ADO方法,從緩存中剝離實體,只需緩存所需的POCO數據。

它並不令人滿意,但最終我發現這樣做的方法是更改​​我的實體以包含屬於外鍵的屬性:

[Required]
public Guid TenantId { get; set; }

[ForeignKey("TenantId")]
public virtual Tenant Tenant { get; set; }

然后我可以從緩存中自由設置TenantId字段(因為它只是一個值類型而不是EF生成的代理類)而不用擔心這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM