Entity Framework 5.0 и FileTable
Допустим, у меня есть следующие таблицы в моей базе данных SQL Server 2012:
Person
PersonId
FirstName
LastName
Photo
PhotoId
PersonId (fk)
DateTaken
PhotoFileTable
(all the FileTable columns)
И фотографии, хранящиеся на диске, имеют следующую структуру: \\myserver\filestreamshare\People\PersonId\Photo1.tif
И очень важно: на диске уже есть тонна фотографий, которые нужно добавить в базу данных, поэтому я подумал, что FileTable будет крутым, так как он автоматически подхватывает их.
Поэтому мне нужно сделать 2 вещи - во-первых, связать таблицу Photo с PhotoFileTable, чтобы я мог получить все фотографии для человека. И второе (и более болезненное), я хочу использовать Entity Framework 5.0 для этого.
Используя конструктор edmx, я не могу добавить таблицу, которая содержит иерархию. Поскольку это первичный ключ, кажется, его следует использовать как отображение 1:1 между PhotoId и path_locator (иерархия FileTable). Но тогда я не могу добавить таблицу фотографий.
Какой лучший подход здесь? В конце дня я хочу использовать объекты EF в C#. В идеале это будет выглядеть примерно так:
class Person
List<Photo>
class Photo
Filestream (to lazy load the image from the filesystem to bitmapimage)
Path (?)
or maybe
class Photo
BitmapImage (lazy load)
Я поступаю об этом неправильно? Могу ли я добраться отсюда? Мысли или предложения?
1 ответ
Может быть, вы можете попробовать это.
Таблица:
PhotoTable(
PhotoID uniqueidentifier ROWGUIDCOL NOT NULL,
PhotoImage varbinary(max) FILESTREAM NULL,
)
Вставка:
create procedure spPhotoInsert
@PhotoID uniqueidentifier
,@sPhotoPath nvarchar(max)
,@PhotoImage varbinary(max)
as
begin
select
cast('' as varbinary(max)) PhotoImage
into
#ret1
truncate table #ret1
declare @strSql nvarchar(max) = 'select * from OPENROWSET(BULK '''
+ @sPhotoPath + ''',SINGLE_BLOB) AS PhotoImage'
insert into #ret1 EXEC(@strSql)
insert into
PhotoTable
(
PhotoID
,PhotoImage
)
select
@PhotoID
,PhotoImage
from
#ret1
drop table #ret1
end
Обновить:
create procedure spPhotoUpdate
@PhotoID uniqueidentifier
,@sPhotoPath nvarchar(max)
,@PhotoImage varbinary(max)
as
begin
select
cast('' as varbinary(max)) PhotoImage
into
#ret1
truncate table #ret1
declare @strSql nvarchar(max) = 'select * from OPENROWSET(BULK '''
+ @sPhotoPath + ''',SINGLE_BLOB) AS PhotoImage'
insert into #ret1 EXEC(@strSql)
update
PhotoTable
set
PhotoImage = r.PhotoImage
from
PhotoTable, #ret1 r
where
PhotoID = @PhotoID
drop table #ret1
end
Удалять:
create procedure PhotoDelete
@PhotoID uniqueidentifier
as
begin
delete
PhotoTable
where
PhotoID = @PhotoID
end
И мнение:
CREATE VIEW vPhotoTable
AS
select
PhotoID
,'' as sPhotoPath
,PhotoImage
from
PhotoTable
После этого изображения можно читать / записывать с помощью EF следующим образом:
//InsertPhoto(sPath)
Entities db = new Entities();
vPhoto p = db.vPhotos.CreateObject();
p.PhotoID = Guid.NewGuid();
p.sPhotoPath = sPath;
db.vPhotos.AddObject(p);
db.SaveChanges();
//UpdatePhoto(PhotoID,sPath):
Entities db = new Entities();
vPhoto p = db.vPhotos.Where(x => x.PhotoID == PhotoID).Single();
p.sPhotoPath = sPath;
db.ObjectStateManager.ChangeObjectState(p, EntityState.Modified);
db.SaveChanges();
//DeletePhoto(PhotoID):
Entities db = new Entities();
vPhoto p = db.vPhotos.Where(x => x.PhotoID == PhotoID).Single();
db.vPhotos.DeleteObject(p);
db.SaveChanges();