【发布时间】:2018-09-03 08:32:15
【问题描述】:
我有一张如下表:
CREATE TABLE MyTable
(
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
LARGEBLOB VARBINARY(MAX) NULL
)
实体定义为:
public class Entity
{
public int Id {get;set;}
public string Name {get;set;}
public virtual byte[] LargeBlob {get;set;}
}
我 99% 的用例只涉及显示 ID 和 NAME。
1% 的时间我需要 LARGEBLOB。
有什么方法可以将 LargeBlob 标记为延迟加载以避免 大量浪费的数据传输?或者,有没有其他方法 达到同样的结果?
我尝试拆分为 2 个具有 1->[0|1] 关系的表,如下所示:
CREATE TABLE MyTable
(
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
LARGEBLOBID INT NULL
)
CREATE TABLE MySubTable
(
ID INT PRIMARY KEY,
LARGEBLOB VARBINARY(MAX) NOT NULL
)
实体
public class Entity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual LargeBlob LargeBlob { get; set; }
}
public class LargeBlob
{
public int Id { get; set; }
public virtual byte[] Blob { get; set; }
}
就延迟加载而言,这确实有效,但我尝试了各种反向关系/外键标签、HasOne、OwnsOne、OnDelete(Cascade) 的各种组合,但我无法实现我想要的想要达到。回顾一下,那就是:
- 仅当 LargeBlob 属性实际取消引用时才会加载 Blob。
- 如果 entity.LargeBlob 属性设置为新的 LargeBlob,则(现在“孤立”)旧的 LargeBlob 将从数据库中删除。
- 如果实体被删除,相关的大 blob 也会被删除。
快速更新:版本 &c
注意:我正在使用 VS 2017 15.6.2、.net core 2.0 和 EF core 2.1(至少有可能进行一些延迟加载)。 Nuget 包:
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.1.0-preview1-final" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0-preview1-final" PrivateAssets="All" />
【问题讨论】:
-
使用 .net 核心,您所做的是一个很好的策略。删除级联的那个应该可以解决问题。什么是你不能做到的? (目前还没有延迟加载之类的东西,但是 2.1 会引入一些它docs.microsoft.com/en-us/ef/core/querying/…)
-
1.我能够实现。 3 我实际上并没有测试,但我很确定会工作。 2是我没有工作的那个。当我设置 Entity.LargeBlob = new LargeBlob() 时,旧的大 blob 留在了表中。关于 2.1 我其实在使用它,会编辑问题。另外会尝试@Ivan Stoev 的回答...
-
是的,我专注于延迟加载,忘记了表拆分选项。他的回答很好,没什么可补充的:)
标签: entity-framework entity-framework-core ef-core-2.0