Настройки отображения FluentNHibernate - хранение файлов в базе данных SQL Server - PullRequest
3 голосов
/ 07 августа 2010

Я читал разные вещи, но не видел ничего конкретного, поэтому я делаю репост. Извините, если я пропустил один и опубликовал дубликат.

Я храню файлы в базе данных; ранее в ADO.NET Entity Framework я использовал тип изображения, и он передавал его в виде массива byte [].

Это подход к выполнению в NHibernate с отображениями FluentNHibernate? Я устанавливаю столбец как изображение. Я определил это как отображение для свойства (свойство C # является массивом byte []):

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

Это правильный способ настроить это? Я получаю сообщение об ошибке и не уверен, связано ли это с этим?

Спасибо.

Ответы [ 3 ]

1 голос
/ 07 августа 2010

Вы также можете сопоставить Custom<TType> s с NHibernate.Type типами

Например:

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

Я сопоставил файлы, сохраненные как двоичные файлы, но они не были 'image 'type.

Я сделал быстрый поиск в Google и нашел сообщение с 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 голос
/ 07 августа 2010

Вам не нужен пользовательский тип. Вот сопоставление, которое работает для столбца образа 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 голосов
/ 08 апреля 2015

У меня есть следующая таблица в 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");
    }
}

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

CONTROLLER:

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

ВИД:

@if (!String.IsNullOrEmpty(Model.LogoImage))
{
    <img src="@String.Format("data:image/png;base64,{0}", Model.LogoImage)" style="width: 200px"/>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...