2010-08-06 34 views
3

我讀過各種東西,但沒有看到具體的東西,所以我正在重新發布。對不起,如果我錯過了一個和重複張貼。FluentNHibernate映射設置 - SQL Server數據庫中的文件存儲

我正在將文件存儲在數據庫中;以前,在ADO.NET實體框架中,我會使用圖像類型,並將其作爲byte []數組進行流式處理。

難道是在NHibernate的FluentNHibernate映射中做到這一點的方法嗎?我將該列設置爲圖像。我所限定的本作爲映射的屬性(該C#屬性是一個字節[]數組):

Map(i => i.FileContents).CustomSqlType("image"); 

是正確的方式來設置?我收到一個錯誤,我不確定它是否與此有關?

謝謝。

回答

1

您也可以Custom<TType>點地圖到NHibernate.Type類型

例如:存儲爲二進制

Map(i => i.FileContents).Custom<NHibernate.Type.BinaryBlobType>(); 

我映射文件,但他們不是「形象」類型。

我做了一個快速的谷歌搜索,並找到了一個ImageUserType的文章,您可以嘗試指定。 http://weblogs.asp.net/ricardoperes/archive/2009/09/17/nhibernate-image-user-type.aspx

編輯。此用戶類型看起來好了很多:http://www.martinwilley.com/net/code/nhibernate/usertype.html

1

您不需要自定義類型。下面是一個SQL Server映像列作品名爲Content的映射:

Map(x => x.Content); 

這裏是映射的用法:

byte[] content = nhSession.CreateCriteria<AttachmentContent>() 
       .Add<AttachmentContent>(ac => ac.Id == 3) 
       .SetProjection(Projections.Property("Content")) 
       .UniqueResult<byte[]>(); 

...這是一個辦法把它弄出來沒有映射(AttachmentDTO不是映射NH類,只是一個普通類):

nhSession.CreateSQLQuery("select a.Content from Attachments a where a.Id = 1") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(AttachmentDTO))) 
    .UniqueResult<AttachmentDTO>(); 

這裏的DTO類:

public class AttachmentDTO { 
    public int Id { get; set; } 
    public string ContentType { get; set; } 
    public byte[] Content { get; set; } 
} 

祝你好運!

0

我有PostgreSQL中下表bytea列:

CREATE TABLE "SystemFiles" 
(
    id integer NOT NULL, 
    name character varying(64), 
    contenttype character varying(64), 
    data bytea, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

這裏是我的實體:

public class SystemFiles 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string ContentType { get; set; } 
    public virtual byte[] Data { get; set; } 
} 

這是我的映射看起來像:

public class SystemFilesMap : ClassMap<SystemFiles> 
{ 
    public SystemFilesMap() 
    { 
     Id(x => x.Id, "id").GeneratedBy.Identity(); 
     Map(x => x.Name).Column("name"); 
     Map(x => x.ContentType).Column("contenttype"); 
     Map(x => x.Data).Column("data"); 
    } 
} 

通過上述配置,我可以讀取sa從數據庫中刪除文件...

控制器:

using (var session = RisDbHelper.OpenSession()) 
{ 
     var tempImage = (from c in session.Query<SystemFiles>() where c.Name == "Logo" select c).FirstOrDefault(); 
     model.LogoImage = Convert.ToBase64String(tempImage.Data); 
} 

VIEW:

@if (!String.IsNullOrEmpty(Model.LogoImage)) 
{ 
    <img src="@String.Format("data:image/png;base64,{0}", Model.LogoImage)" style="width: 200px"/> 
}