Могу ли я лениво загрузить скалярные свойства с помощью ADO.Net Entity Framework? - PullRequest
2 голосов
/ 24 апреля 2009

У меня есть таблица базы данных Изображение с одним огромным столбцом: Данные .

One Entity

Я бы предпочел лениво загрузить этот столбец, чтобы не запрашивать все это, когда получаю список всех своих изображений.

Я знаю, что могу поместить данные в отдельный столбец и сущность следующим образом:

Two Entities

Но я должен?

Ответы [ 2 ]

4 голосов
/ 24 апреля 2009

Да, я верю, что ты должен. Я не думаю, что это возможно с EF.

Вы можете сделать явный запрос для нужных вам столбцов, а затем - для столбца данных. Понравилось предложение в этом посте:

Как загружать поля varbinary (max) только при необходимости с ADO.NET Entity Framework?

Но похоже, что Linq To SQL предоставляет такую ​​возможность, поэтому я попытаюсь разобраться, подходит ли она и для EF.

0 голосов
/ 20 июня 2015

У вас есть доступ к схеме данных? В Entity Framework вы не можете иметь две сущности, которые ссылаются на одну и ту же таблицу, ** по крайней мере, вы не могли в прошлом. С этим сказал. Вы можете создать Sql VIEW со столбцом данных.

CREATE VIEW [dbo].[ImageData]
SELECT
    Id,
    Data
FROM Image

Теперь вы можете создать данные изображения с именем объекта, которые отражают вашу схему выше.

Если вам нужно обновить представление, это также возможно, вам просто нужно создать триггер для представления, называемый 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...