我有一个数据库表Image,其中包含一个巨大的列:Data。
我宁愿延迟加载那一列,所以当我获得所有图像的列表时,我不会查询所有内容。
我知道我可以将数据放入它自己的列和实体中,如下所示:
但是,我必须这样做吗?
我有一个数据库表Image,其中包含一个巨大的列:Data。
我宁愿延迟加载那一列,所以当我获得所有图像的列表时,我不会查询所有内容。
我知道我可以将数据放入它自己的列和实体中,如下所示:
但是,我必须这样做吗?
是的,我相信你必须这样做。我认为EF不可能。
您可以对所需的列进行显式查询,然后再对数据列进行查询。就像这篇文章中的建议一样:
如何仅在需要时使用 ADO.NET Entity Framework 加载 varbinary(max) 字段?
但似乎 Linq To SQL 提供了这种可能性,所以我会尝试研究它是否也会出现在 EF 中。
您有权访问数据模式吗?在实体框架中,您不能有两个实体引用同一个表,**至少您过去不能。照这样说。您可以使用数据列创建一个 Sql VIEW。
CREATE VIEW [dbo].[ImageData]
SELECT
Id,
Data
FROM Image
现在,您可以创建一个名为 Image Data 的实体来反映您的上述模式。
如果您需要更新视图,这也是可能的,您只需在视图上创建一个名为 INSTEAD OF TRIGGER 的触发器。
-- INSERT Trigger
CREATE TRIGGER [dbo].[TR_ImageData_Update] ON [ImageData]
INSTEAD OF INSERT
AS
BEGIN
UPDATE [Image]
SET Data = i.Data
FROM Inserted AS i
END;
GO
在大多数情况下,这可能是理想的。但是,如果您无权访问数据库架构,则可能无法执行此操作。相反,您将从图像实体中创建一个默认查询。
public static IQueryable GetImages(this DbContext db)
{
var query = db.Images.AsQueryable();
return query.Select(r => new Image() { Id = r.id....});
}
public static IQueryable GetImageData(this DbContext db, int imageId)
{
var query = db.Images.AsQueryable();
query = query.Where(x => x.Id == imageId);
query = query.Select(x => new ImageData() { Id = r.Id, Data = r.Data });
return query;
}