2012-11-01 79 views
2

所以說,我在我的SQL Server 2012數據庫下表:實體框架5.0的FileTable

Person 
    PersonId 
    FirstName 
    LastName 

Photo 
    PhotoId 
    PersonId (fk) 
    DateTaken 

PhotoFileTable 
    (all the FileTable columns) 

,並存儲在磁盤上的照片都是結構是這樣的: \\ MYSERVER \ filestreamshare \人\ PERSONID \ Photo1.tif

而且非常重要:在磁盤上有一張TON照片需要添加到數據庫 - 這就是爲什麼我認爲FileTable會很酷,因爲它會自動拾取它們。

所以我需要做2件事情 - 首先,將照片表與PhotoFileTable相關聯,以便我可以獲取一個人的所有照片。第二個(也更痛苦)我想用Entity Framework 5.0來做到這一點。

使用edmx設計器,我無法添加包含hierarchyid的表。由於這是主鍵,它似乎應該用作PhotoId和path_locator(FileTable的hierarchyid)之間的1:1映射。但是,我無法添加照片表。

這裏最好的辦法是什麼?在這一天結束時,我想讓C#中的EF對象使用。理想情況下,它看起來像這樣:

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) 

我該怎麼做這個錯誤的方式呢?我可以從這裏到達嗎?想法或建議?

回答

2

也許你可以試試這個。

表:

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(); 
+0

好的,謝謝!除了我的數據庫中的表是SQL 2012 FileTable,而不是FileStream。所以問題仍然是如何在DB端將這兩件事聯繫在一起。雖然SP方法可能是正確的... – Nicros

+0

我同意,我很抱歉,但我沒有意識到我們正在談論SQL 2012。 –