2 Stimmen

NHibernate MappingException: kein Persister für byte[]

Ich verwende NHibernate zum Speichern von Downloads in meiner MySQL-Datenbank für eine ASP.NET MVC-Website. Ich verwende zwei Klassen. Eine heißt Download für den Download selbst und eine mit der Bezeichnung DownloadContent für die Datei selbst (damit ich sie leichter laden kann, wenn ich nur die Metadaten abrufen will).

Die Deklarationen und Zuordnungen der Datenklassen sehen wie folgt aus:

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

Wenn ich jetzt versuche, so etwas zu tun:

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

Ich bekomme eine NHibernate.MappingException mit der Meldung "No persister for: System.Byte[]". Ich habe in den NHibernate-Dokumenten nachgeschaut und byte[] sollte korrekt zugeordnet werden.

Was mache ich falsch?

2voto

Florian Lim Punkte 5302

Wenn ich das richtig gelesen habe, versuchen Sie tatsächlich, die byte[] zur DB, was nicht funktionieren kann, da byte[] ist keine gemappte Entität.

Sie möchten wahrscheinlich schreiben:

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

Da Sie außerdem keine Inverse() müssen Sie wahrscheinlich SaveOrUpdate die DownloadContent also zuerst:

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

2voto

James Kovacs Punkte 11419

Sie haben einen CustomType von BinaryBlob angegeben. NHibernate wird nach einem IUserType namens BinaryBlob suchen, um die Persistenz durchzuführen. Ich denke, Sie wollen, dass CustomSqlType angibt, dass MySQL den Typ BinaryBlob in der Datenbank verwenden soll.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X