8

我的一个表中有一个 varbinary(max) 字段,但我并不每次都需要它,我正在寻找一种仅在必要时从数据库中获取它的方法。我正在使用 ADO.NET 实体框架。怎么做?

4

5 回答 5

6

解决方案是使用 varbinary 字段创建一个单独的表,并在表之间建立一对一的关系

于 2009-03-20T11:44:02.157 回答
4

不一定要创建单独的表。你应该做几个步骤。假设我们有表“文档”(Id、Name、Data (varbinary))。

  1. 打开 EF 设计器,复制并粘贴“文档”实体。
  2. 将其重命名为“DocumentData”。将映射添加到“文档”表。
  3. 删除“文档”实体中的“数据”属性。
  4. 删除“DocumentData”实体中的“名称”属性。
  5. 右键单击“DocumentData”实体并添加新的关联。选择与“文档”实体的一对一关联。
  6. 选择新关联,转到属性,单击“引用约束”字段上的“...”,选择“文档”实体作为主体,将所有内容保留为默认值(Id -> Id),然后单击“确定”。

现在构建项目。

笔记。现在,在创建新的“文档”实体时,即使您还不想放置任何数据,您也应该创建新的“文档数据”实体:

Document doc = new Document();

doc.Name = "My document";
doc.DocumentData = new DocumentData();

context.Documents.Add(doc);
context.SaveChanges();
于 2011-01-29T12:45:02.020 回答
1

一种方法是在不需要 blob 时将结果集投影为匿名类型:

from entity in context.Entities
select new 
{
    Field1 = entity.Field1,
    Field2 = entity.Field2
}

在此示例中,仅加载 Field1 和 Field2。

此方法的缺点是您无法更新返回的实例并执行 context.SaveChanges。尽管我认为在不完全了解实例的情况下保存实例是不安全的。当您想要返回实例的长列表时,此方法很好,但在实际更新之前将查询单个实例、varbinary 字段和所有。

于 2009-03-19T17:23:02.537 回答
1

您应该从表中删除您的 varbinary 字段,并将其放在另一个表中,在它们之间建立一对一的关系。这是一个很好的做法,因为您可以轻松实现延迟加载和其他内容。

于 2012-09-18T19:03:07.800 回答
0

表拆分。Entity Developer工具允许直观地执行此操作。您可以将实体映射到不同的表。

于 2011-02-09T16:57:27.190 回答