如何在必要时使用ADO.NET Entity Framework加载varbinary(max)字段?

我的一个表中有一个varbinary(max)字段,但我不是每次都需要它,而且我正在寻找一种只在必要时从数据库中获取它的方法。 我正在使用ADO.NETentity framework。 怎么做?

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

它不一定要创建单独的表。 你应该做几个步骤。 假设我们有表’Documents’(Id,Name,Data(varbinary))。

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

现在构建项目。

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

Document doc = new Document(); doc.Name = "My document"; doc.DocumentData = new DocumentData(); context.Documents.Add(doc); context.SaveChanges(); 

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

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

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

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

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

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