[英]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提取租戶記錄。 但是,現在我要去查詢數據庫是沒有正當理由的。
緩存數據的非變更跟蹤,非實體視角會更有意義嗎? 租戶記錄似乎是外鍵關系的“指針”。
我的邏輯如下:
在大多數情況下,您似乎只需要保留映射到一個或多個主機名的租戶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.