NHibernate MappingException: не сохраняется для байта [] - PullRequest
2 голосов
/ 31 марта 2011

Я использую NHibernate для хранения загрузок в моей базе данных MySQL для веб-сайта ASP.NET MVC.Я использую для занятий.Один из них называется Download для самой загрузки, а другой - DownloadContent для самого файла (поэтому я могу загрузить его проще, когда просто хочу получить метаданные).

Объявления и отображения классов данных выглядят какthis:

public class Download
{
    public virtual string Id { get; set; }
    public virtual string OutFileName { get; set; }
    public virtual DownloadContent Contents { get; set; }
    public virtual string MimeType { get; set; }
    public virtual bool DoForward { get; set; }
    public virtual string RedirectLink { get; set; }
}

public class DownloadMap : ClassMap<Download>
{
    public DownloadMap()
    {
        Id(x => x.Id);
        Map(x => x.OutFileName);
        References<DownloadContent>(x => x.Contents);
        Map(x => x.MimeType);
        Map(x => x.DoForward).Not.Nullable();
        Map(x => x.RedirectLink);
    }
}

public class DownloadContent
{
    public virtual byte[] Data { get; set; }
}

public class DownloadContentMap : ClassMap<DownloadContent>
{
    public DownloadContentMap()
    {
        Id();
        Map(x => x.Data).CustomType("BinaryBlob");
    }
}

Теперь, когда я пытаюсь сделать это следующим образом:

dl.Contents = new DownloadContent { Data = content };
db.session.SaveOrUpdate(content);

я получаю NHibernate.MappingException с сообщением "Нет сохранения для: System.Byte []",Я посмотрел его с помощью документов NHibernate, и байт [] должен отображаться правильно.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Вы указали CustomType BinaryBlob. NHibernate будет искать IUserType с именем BinaryBlob для выполнения персистентности. Я думаю, вы хотите, чтобы CustomSqlType говорил, что MySQL должен использовать свой тип BinaryBlob в базе данных.

public class DownloadContentMap : ClassMap<DownloadContent>
{
    public DownloadContentMap()
    {
        Id();
        Map(x => x.Data).CustomSqlType("BinaryBlob");
    }
}
2 голосов
/ 01 апреля 2011

Если я правильно прочитал, вы на самом деле пытаетесь сохранить byte[] в БД, которая не может работать, поскольку byte[] не является отображенной сущностью.

Возможно, вы захотите написать:

dl.Contents = new DownloadContent { Data = content };
db.session.SaveOrUpdate(dl); // content is wrong, since content is of type byte[]

Кроме того, поскольку вы не указали Inverse(), вам, вероятно, придется сначала SaveOrUpdate DownloadContent, поэтому:

Download dl = new Download { OutFileName = "Test", DoForward = true };
DownloadContent dlc = new DownloadContent { Data = content };
dl.Contents = dlc;
db.session.SaveOrUpdate(dlc);
db.session.SaveOrUpdate(dl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...