我有一個簡單的表,其中包含鍵、名稱和二進制內容。我只在需要時才需要加載二進制內容。這在 Linq2Sql 中曾經非常簡單,但在 EF core 6 中,除了導航集合的延遲加載之外,我找不到任何東西,這不是我需要的。我是遺漏了什么還是 EF 核心中遺漏了什么?吉里
public class Content {
public int Id { get; set; }
public string Name { get; set; }
public byte[] Data { get; set; } // How to delay loading this ?
}
命令
ctx.Content.Select(x =x.Id==1);
預期的 SQL 是:
SELECT Id, Name FROM Content WHERE Id=1
uj5u.com熱心網友回復:
可選加載某些內容的唯一方法是使用導航屬性。
在您的情況下,解決方案是僅包含byte[]屬性并配置了表拆分以與主物體共享同一個表的假物體。
請注意,這只是邏輯分離,不需要更改資料庫架構。表格拆分檔案中的第一行指出:
EF Core 允許將兩個或多個物體映射到單行。這稱為表拆分或表共享。
可能您對拆分一詞感到困惑。它不是拆分資料庫中的物理表,而是在幾個物體之間拆分(共享)它。
例如
模型
public class Content
{
public int Id { get; set; }
public string Name { get; set; }
public ContentData Data { get; set; }
}
public class ContentData
{
public byte[] Data { get; set; }
}
配置
modelBuilder.Entity<ContentData>()
.ToTable("Content"); // must be the same as for Content entity
modelBuilder.Entity<ContentData>()
.Property<int>("ContentId");
modelBuilder.Entity<ContentData>()
.HasKey("ContentId");
modelBuilder.Entity<Content>()
.HasOne(e => e.ContentData)
.WithOne()
.HasForeignKey<ContentData>("ContentId");
現在Content.Data將不會自動加載,您可以Include在需要時使用通常的方式加載它。唯一的缺點是多了一個物件實體和實際byte[]屬性訪問器 -content.Data.Data與原來的content.Data.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409451.html
標籤:
上一篇:UnityC#匯入本地包
