c# - 从没有一个字段的 Entity Framework 中检索对象

标签 c# .net sql entity-framework

我正在使用 Entity Framework 连接数据库。我有一个小问题:

我有一张表,其中有一个 varbinary(MAX) 列(带有文件流)。

我使用 SQL 请求来管理“数据”部分,但使用 EF 管理其余部分(文件的元数据)。

我有一个代码必须获取文件的所有文件 ID、文件名、GUID、修改日期……。这根本不需要“数据”字段。

有没有办法检索列表但没有填充此列?

有点像

context.Files.Where(f=>f.xyz).Exclude(f=>f.Data).ToList();

??

我知道我可以创建匿名对象,但我需要将结果传递给一个方法,所以没有匿名方法。而且我不想把它放在一个匿名类型的列表中,然后创建一个我的非匿名类型(文件)的列表。

目标是避免这种情况:

using(RsSolutionsEntities context = new RsSolutionsEntities())
{
    var file = context.Files
        .Where(f => f.Id == idFile)
        .Select(f => new {
            f.Id, f.MimeType, f.Size, f.FileName, f.DataType,
            f.DateModification, f.FileId
        }).FirstOrDefault();

    return new File() {
        DataType = file.DataType, DateModification = file.DateModification,
        FileId = file.FileId, FileName = file.FileName, Id = file.Id,
        MimeType = file.MimeType, Size = file.Size
    };
}

(我在这里使用匿名类型,否则你会得到一个 NotSupportedException:实体或复杂类型 'ProjectName.File' 不能在 LINQ to Entities 查询中构造。)

(例如,此代码抛出先前的异常:

File file2 = context.Files.Where(f => f.Id == idFile)
  .Select(f => new File() {Id = f.Id, DataType = f.DataType}).FirstOrDefault();

"file"是我通过 context.Files.ToList() 获得的类型。这是很好的类(class):

using File = MyProjectNamespace.Common.Data.DataModel.File;

文件是我的 EF 数据上下文的已知类:

public ObjectSet<File> Files
{
    get { return _files  ?? (_files = CreateObjectSet<File>("Files")); }
}
private ObjectSet<File> _files;

最佳答案

Is there a way to retrieve a List but without this column filled?

并非没有您想避免的转换。如果该列已映射,则它是您实体的自然组成部分。没有此列的实体是不完整的 - 它是不同的数据集 = 投影。

I'm using here the anonymous type because otherwise you will get a NotSupportedException: The entity or complex type 'ProjectName.File' cannot be constructed in a LINQ to Entities query.

作为异常(exception),您不能投影到映射的实体。我在上面提到了原因——投影会产生不同的数据集,而 EF 不喜欢“部分实体”。

Error 16 Error 3023: Problem in mapping fragments starting at line 2717:Column Files.Data in table Files must be mapped: It has no default value and is not nullable.

仅从设计器中删除属性是不够的。您必须以 XML 格式打开 EDMX 并从 SSDL 中删除列,这将使您的模型非常脆弱(数据库的每次更新都会将您的列放回原处)。如果您不想映射列,您应该使用不带列的数据库 View 并映射 View 而不是表,但您将无法插入数据。

作为解决所有问题的方法,请使用 table splitting并将有问题的二进制列分离到与您的主要 File 实体具有 1 : 1 关系的另一个实体。

关于c# - 从没有一个字段的 Entity Framework 中检索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8973529/

相关文章:

sql - 如何将 .bak 文件导入 Microsoft SQL Server 2012?

c# - Console.ReadLine else-if 语句中的意外行为

c# - ReSharper 想要 "Optimize"我的代码

c# - 在 Windows 窗体应用程序中托管 ASP.NET Core API

c# - 是否可以更改 Winforms 组合框以禁止在其中输入内容?

c# - 无法从 Azure 函数中的 Blob 存储读取文件

c# - 如何从另一个 View 模型实例化和显示一个 ViewModel

mysql - 使用sql生成组合

c# - 多个启动项目之间的 Visual Studio 延迟?

mysql - SQL 查询 - 确定谁只有一条礼物记录