gpt4 book ai didi

c# - Entity Framework 5.0 和 FileTable

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:06 25 4
gpt4 key购买 nike

假设我的 SQL Server 2012 数据库中有以下表格:

Person
PersonId
FirstName
LastName

Photo
PhotoId
PersonId (fk)
DateTaken

PhotoFileTable
(all the FileTable columns)

存储在磁盘上的照片结构如下:\\myserver\filestreamshare\People\PersonId\Photo1.tif

而且非常重要:磁盘上已经有大量照片需要添加到数据库中 - 这就是为什么我认为 FileTable 会很酷,因为它会自动拾取它们。

所以我需要做两件事 - 首先,将 Photo 表与 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)

我是不是用错了方法?我可以从这里到那里吗?想法或建议?

最佳答案

也许你可以试试这个。

表:

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

和 View :

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

关于c# - Entity Framework 5.0 和 FileTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com