首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在实体框架核心6- C#中延迟加载二进制属性C#

如何在实体框架核心6- C#中延迟加载二进制属性C#
EN

Stack Overflow用户
提问于 2022-01-12 17:13:29
回答 1查看 454关注 0票数 5

我有一个简单的表,包含键、名称和二进制内容。我只需要在需要的时候加载二进制内容。这过去在Linq2Sql中非常简单,但是在EF核心6中,除了延迟加载导航集合之外,我找不到任何东西,这不是我所需要的。我漏掉了什么吗?或者这是EF核心的缺失?伊日

代码语言:javascript
代码运行次数:0
运行
复制
public class Content {
 public int Id { get; set; }
 public string Name { get; set; }
 public byte[] Data { get; set; } // How to delay loading this ? 
}

命令

代码语言:javascript
代码运行次数:0
运行
复制
ctx.Content.Select(x =x.Id==1);

预期SQL为:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT Id, Name FROM Content WHERE Id=1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-12 18:33:28

可选加载某些内容的唯一方法是使用导航属性。

在您的情况下,解决方案是假实体,只包含byte[]属性,并配置为表分裂,以便与主实体共享同一个表。

请注意,这只是逻辑分离,不需要更改DB模式。表中拆分文档的第一行内容如下:

EF允许将两个或多个实体映射到一行。这被称为表拆分或表共享。

也许你和“分裂”这个词混淆了。它不是拆分数据库中的物理表,而是在多个实体之间分割(共享)它。

例如:

模型

代码语言:javascript
代码运行次数:0
运行
复制
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; }
}

配置

代码语言:javascript
代码运行次数:0
运行
复制
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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70685674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档