我在Oracle DB中有一个表DOCUMENTS,具有以下描述
create table DOCUMENTS
(
DOC_ID NUMBER not null,
DOCUMENT BLOB not null,
DOC_URL VARCHAR2(4000)
)
这是一个简单的表,用于存储来自多个来源的图像。从其中一个来源开始,要求是仅插入图像的HTTP路径而不添加DOCUMENT(Document为NULL)。
由于该列在表中被定义为NOT NULL,所以我试图通过在表中插入一个空的Blob来克服约束。我在INSERT语句中使用empty_blob()函数在PlSql语句中工作,如下所示
使用Pl / Sql
insert into DOCUMENTS (doc_id,document,doc_url) values SEQ_DOCUMENT_ID.nextval, empty_blob(), 'http://path_to_image');
commit;
但是当我尝试从NHibernate持久性插入它时,我收到一条错误消息,提示“ ORA-01400:无法插入NULL ”
在Nhibernate中不可用
using (var session = SessionFactory.OpenSession())
{
Document documentDomain = new Document();
documentDomain.doc_url = "http://path_to_the_document";
documentDomain.document = new byte[0];
session.Save(documentDomain);
}
我这里缺少什么吗?
答案 0 :(得分:1)
如果原始SQL适合您(绕过Document
域模型),则NHibernate允许您执行原始SQL查询。
var sql = @"<Your Sql Here>";
int count = session.CreateSQLQuery(sql)
.ExecuteUpdate();
因此,以下类似内容应为您工作:
using (var session = SessionFactory.OpenSession())
{
session.CreateSQLQuery("insert into DOCUMENTS (doc_id,document,doc_url) values SEQ_DOCUMENT_ID.nextval, empty_blob(), 'http://path_to_image');")
.ExecuteUpdate();
}
通过执行原始SQL,您的事务仍将得到兑现。唯一的区别是会话级缓存。通过原始SQL执行的内容不会反映会话级缓存。如果您使用的是using
块,那么从Session
的有限范围来看,这应该不是什么大问题。