2009-04-24 5 views
2

У меня есть таблица базы данных Изображение с одной огромной колонкой: Данные.Могу ли я ленить скалярные свойства с помощью платформы ADO.Net Entity Framework?

One Entity

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

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

Two Entities

Но я должен?

ответ

4

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

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

How to load varbinary(max) fields only when necessary with ADO.NET Entity Framework?

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

0

У вас есть доступ к схеме данных? В 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; 
}