【发布时间】:2012-02-16 21:56:46
【问题描述】:
我正在使用实体框架来连接数据库。我有一个小问题:
我有一张表,它有一个 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:无法在 LINQ to Entities 查询中构造实体或复杂类型“ProjectName.File”。)
(例如,这段代码抛出了前面的异常:
File file2 = context.Files.Where(f => f.Id == idFile)
.Select(f => new File() {Id = f.Id, DataType = f.DataType}).FirstOrDefault();
“文件”是我使用context.Files.ToList() 得到的类型。这是好课:
using File = MyProjectNamespace.Common.Data.DataModel.File;
文件是我的 EF 数据上下文的已知类:
public ObjectSet<File> Files
{
get { return _files ?? (_files = CreateObjectSet<File>("Files")); }
}
private ObjectSet<File> _files;
【问题讨论】:
-
您可以从您的 EF 对象中删除该列吗?
-
我希望我可以,但它是一个“NON NULL”列,EF 不喜欢我有不在模型中的非空列
-
EF 在排除非空列时遇到问题的唯一原因是在
INSERT到数据库期间。您可以使用过程、触发器和其他方法来解决这个问题。对于SELECT,您绝对可以排除表格列。 -
我试过了,但由于我删除了“数据”字段,即使我没有在任何地方做任何“插入”,我的 edmx 模型中也出现异常:错误 16 错误 3023:问题从第 2717 行开始的映射片段:必须映射表 Files 中的列 Files.Data:它没有默认值且不可为空。
-
你能编辑实际的数据库吗?可能值得将 Data 列移到它自己的表中。
标签: c# .net sql entity-framework