Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅在ADO.NET实体框架需要时加载varbinary(max)字段?_C#_Linq_Entity Framework_Ado.net_Linq To Entities - Fatal编程技术网

C# 如何仅在ADO.NET实体框架需要时加载varbinary(max)字段?

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 此方法的缺点是无法更新

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

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

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))

  • 打开EF designer,复制并粘贴“文档”实体
  • 将其重命名为“DocumentData”。将映射添加到“文档”表
  • 删除“文档”实体中的“数据”属性
  • 删除“DocumentData”实体中的“Name”属性
  • 右键单击“DocumentData”实体并添加新关联。选择与“文档”实体的1对1关联
  • 选择新关联,转到属性,在“引用约束”字段上单击“…”,选择“文档”实体作为主体,将所有实体保留为默认(Id->Id),然后单击确定
  • 现在构建项目

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

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

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

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

    谢谢您的帮助。我一直在寻找类似于延迟加载varbinary字段:)的方法,但这似乎是不可能的。在现有模式上并不总是可能的,但在可能的情况下,这可能是最简单的方法。我这样做了,在我的“主表”中使用一个指向“secondary”表的外键,检查FK是否为null,这样就可以快速知道是否存在“secondary”记录,而不必实际加载它。