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

时间:2009-03-19 16:13:24

标签: c# linq entity-framework ado.net linq-to-entities

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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