【问题标题】:How to load varbinary(max) fields only when necessary with ADO.NET Entity Framework?如何仅在需要时使用 ADO.NET Entity Framework 加载 varbinary(max) 字段?
【发布时间】:2010-10-14 08:31:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 在现有架构上并不总是可行的,但可能是最简单的方法。我做到了,在我的“主表”中使用“辅助”表的外键,检查 FK 是否为空,允许快速知道是否存在“辅助”记录,而无需实际加载它。
    【解决方案2】:

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

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

    现在构建项目。

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

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

    【讨论】:

      【解决方案3】:

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

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

      在本例中,只会加载 Field1 和 Field2。

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

      【讨论】:

      • 感谢您的帮助。我正在寻找类似于延迟加载 varbinary 字段的东西:) 但似乎这是不可能的。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-14
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          相关资源
          最近更新 更多