2011-03-31 4 views
2

J'utilise NHibernate pour stocker des téléchargements dans ma base de données MySQL pour un site web ASP.NET MVC. J'utilise pour les cours. Un appelé Download pour le téléchargement lui-même et un appelé DownloadContent pour le fichier lui-même (donc je peux le charger plus facilement quand je veux juste obtenir les métadonnées).NHibernate MappingException: pas de persister pour byte []

Les déclarations de classe de données et applications ressemblent à ceci:

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

Maintenant, quand j'essaie de faire comme ceci:

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

je reçois un NHibernate.MappingException avec le message « Pas de persister pour: System.Byte [] ". Je l'ai cherché avec les documents NHibernate et l'octet [] devrait correspondre correctement.

Qu'est-ce que je fais mal?

Répondre

2

Si je lis cela correctement, vous essayez en fait d'enregistrer le byte[] dans la base de données, ce qui ne peut pas fonctionner car byte[] n'est pas une entité mappée.

Vous voulez probablement écrire:

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

De plus, puisque vous ne spécifiez pas de Inverse(), vous aurez probablement à SaveOrUpdate la première DownloadContent donc:

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

qui est à peu près ce que je fais déjà –

+0

@ DontCare4Free Votre code 'dit db.session.SaveOrUpdate (contenu),' moins que ce soit une faute de frappe ou je manque quelque chose, « contenu » est de type octet [ ], que vous ne pouvez pas passer en paramètre 'SaveOrUpdate()' –

+0

Il s'agit d'un wrapper autour du type byte []. –

2

Vous avez spécifié un CustomType de BinaryBlob. NHibernate recherchera un IUserType appelé BinaryBlob pour effectuer la persistance. Je pense que vous voulez que CustomSqlType dise que MySQL doit utiliser son type BinaryBlob dans la base de données.

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