【发布时间】:2010-10-14 08:31:00
【问题描述】:
我的一个表中有一个 varbinary(max) 字段,但我并不每次都需要它,我正在寻找一种仅在必要时从数据库中获取它的方法。我正在使用 ADO.NET 实体框架。该怎么做?
【问题讨论】:
标签: c# linq entity-framework ado.net linq-to-entities
我的一个表中有一个 varbinary(max) 字段,但我并不每次都需要它,我正在寻找一种仅在必要时从数据库中获取它的方法。我正在使用 ADO.NET 实体框架。该怎么做?
【问题讨论】:
标签: c# linq entity-framework ado.net linq-to-entities
解决方案是使用 varbinary 字段创建一个单独的表,并在表之间建立一对一的关系
【讨论】:
不一定要创建单独的表。你应该做几个步骤。假设我们有表“文档”(Id、Name、Data (varbinary))。
现在构建项目。
注意。现在,在创建新的“文档”实体时,即使您还不想放置任何数据,您也应该创建新的“文档数据”实体:
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 字段等。
【讨论】:
您应该从表中删除您的 varbinary 字段,并将其放在另一个表中,从而在它们之间建立一对一的关系。 这是一个很好的做法,因为您可以轻松实现延迟加载和其他内容。
【讨论】:
表拆分。 Entity Developer 工具允许直观地执行此操作。您可以为不同的表映射您的实体。
【讨论】: