C# 如何仅在ADO.NET实体框架需要时加载varbinary(max)字段?
我的一个表中有一个varbinary(max)字段,但我并不每次都需要它,我正在寻找一种仅在必要时从数据库中获取它的方法。我正在使用ADO.NET实体框架。如何做到这一点?一种方法是在不需要blob时将结果集投影到匿名类型:C# 如何仅在ADO.NET实体框架需要时加载varbinary(max)字段?,c#,linq,entity-framework,ado.net,linq-to-entities,C#,Linq,Entity Framework,Ado.net,Linq To Entities,我的一个表中有一个varbinary(max)字段,但我并不每次都需要它,我正在寻找一种仅在必要时从数据库中获取它的方法。我正在使用ADO.NET实体框架。如何做到这一点?一种方法是在不需要blob时将结果集投影到匿名类型: from entity in context.Entities select new { Field1 = entity.Field1, Field2 = entity.Field2 } 在本例中,仅加载Field1和Field2 此方法的缺点是无法更新
from entity in context.Entities
select new
{
Field1 = entity.Field1,
Field2 = entity.Field2
}
在本例中,仅加载Field1和Field2
此方法的缺点是无法更新返回的实例并执行context.SaveChanges。尽管我认为在不完全了解实例的情况下保存实例是非常不安全的。如果您需要返回实例的长列表,但在实际更新之前将查询单个实例、varbinary字段和所有实例,则此方法很好。解决方案是使用varbinary字段创建一个单独的表,并在表之间建立1对1的关系。不一定要创建单独的表。你应该做几个步骤。假设我们有表“Documents”(Id、Name、Data(varbinary))
Document doc = new Document();
doc.Name = "My document";
doc.DocumentData = new DocumentData();
context.Documents.Add(doc);
context.SaveChanges();
表拆分。该工具允许直观地执行此操作。您可以为不同的表映射实体。您应该从表中删除varbinary字段,并将其放在另一个表中,在这些表之间建立一对一的关系。
这是一个很好的实践,因为您可以轻松实现延迟加载和其他功能。谢谢您的帮助。我一直在寻找类似于延迟加载varbinary字段:)的方法,但这似乎是不可能的。在现有模式上并不总是可能的,但在可能的情况下,这可能是最简单的方法。我这样做了,在我的“主表”中使用一个指向“secondary”表的外键,检查FK是否为null,这样就可以快速知道是否存在“secondary”记录,而不必实际加载它。