我正在使用 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/