我有一个简单的表,其中包含密钥、名称和二进制内容。我只需要在需要时加载二进制内容。这在 Linq2Sql 中曾经非常简单,但在 EF core 6 中,除了导航集合的延迟加载之外,我找不到任何东西,这不是我需要的。我是否遗漏了某些内容,或者 EF core 中缺少此内容吗?
吉里
public class Content {
public int Id { get; set; }
public string Name { get; set; }
public byte[] Data { get; set; } // How to delay loading this ?
}
Command
ctx.Content.Select(x =x.Id==1);
预期的 SQL 是:
SELECT Id, Name FROM Content WHERE Id=1
选择性加载某些内容的唯一方法是使用导航属性。
您的情况的解决方案是仅包含byte[]
属性并配置为表分割 https://learn.microsoft.com/en-us/ef/core/modeling/table-splitting与主要实体共享同一个表。
请注意,这只是逻辑分离,不需要更改数据库架构。表分割文档中的第一行指出:
EF Core 允许将两个或多个实体映射到一行。这就是所谓的表分割 or 餐桌共享.
您可能对“分裂”一词感到困惑。它不是拆分数据库中的物理表,而是在多个实体之间拆分(共享)它。
e.g.
Model
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");
Now the Content.Data
不会自动加载,你可以使用通常的Include
需要时加载它。唯一的缺点是一个额外的对象实例和实际的byte[]
属性访问器 -content.Data.Data
与原来的content.Data
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)