我正在使用NHibernate在我的MySQL数据库中为ASP.NET MVC网站存储下载。我正在上课。一个名为Download
用于下载本身,一个名为DownloadContent
用于文件本身(因此,当我只想获取元数据时,我可以更轻松地加载它)。
数据类声明和映射如下所示:
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
,上面写着“No persister for:System.Byte []”。我用NHibernate文档查找了它,而byte []应该正确映射。
我做错了什么?
答案 0 :(得分:2)
如果我读得正确,您实际上是在尝试将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);
答案 1 :(得分:2)
您指定了BinaryBlob的CustomType。 NHibernate将查找名为BinaryBlob的IUserType来执行持久性。我想你想让CustomSqlType说MySQL应该在数据库中使用它的BinaryBlob类型。
public class DownloadContentMap : ClassMap<DownloadContent>
{
public DownloadContentMap()
{
Id();
Map(x => x.Data).CustomSqlType("BinaryBlob");
}
}