将byte [0]插入Oracle DB表的NOT NULLABLE列中

时间:2019-07-09 09:38:27

标签: c# oracle nhibernate fluent-nhibernate

我在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);
}

我这里缺少什么吗?

1 个答案:

答案 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的有限范围来看,这应该不是什么大问题。