2

我有一个数据库表Image,其中包含一个巨大的列:Data

一个实体

我宁愿延迟加载那一列,所以当我获得所有图像的列表时,我不会查询所有内容。

我知道我可以将数据放入它自己的列和实体中,如下所示:

两个实体

但是,我必须这样做吗?

4

2 回答 2

4

是的,我相信你必须这样做。我认为EF不可能。

您可以对所需的列进行显式查询,然后再对数据列进行查询。就像这篇文章中的建议一样:

如何仅在需要时使用 ADO.NET Entity Framework 加载 varbinary(max) 字段?

但似乎 Linq To SQL 提供了这种可能性,所以我会尝试研究它是否也会出现在 EF 中。

于 2009-04-24T17:19:04.650 回答
0

您有权访问数据模式吗?在实体框架中,您不能有两个实体引用同一个表,**至少您过去不能。照这样说。您可以使用数据列创建一个 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;
}
于 2015-06-19T21:01:15.070 回答