【发布时间】:2013-12-03 23:01:52
【问题描述】:
我将 NHibernate 与 XML 映射和 Oracle DB 一起使用。我有这个简单的映射:
<class name="ProjectInfo" table="T_PROJECT">
<id name="Id" column="IDENT" />
<property name="Customer" />
<join table="T_PROJECTRUN" optional="true">
<key column="PRIDENT" />
<property name="Remarks" column="Remarks" />
<property name="RemarksTimestamp" column="Remarks_TS" />
</join>
</class>
和实体:
public class ProjectInfo : EntityBase<ProjectInfo, int>
{
public string Customer { get; set; }
public string Remarks { get; set; }
public DateTime RemarksTimestamp { get; set; }
}
ProjectInfo 应该充当更复杂的Project 实体的只读(来自数据库)视图。它具有类似的映射但没有两个 Remarks 属性。
我怎样才能让 NHibernate 永远不会尝试将 ProjectInfo 实体写入数据库而只从数据库中读取它?所以从 NHibernate 来看,我猜这将是只写的。
目前,每当我尝试使用 this.Session.Update(entity) 更新 Project 实体时,都会出现以下异常:
NHibernate.Exceptions.GenericADOException occurred
HResult=-2146232832
Message=could not insert: [MyNamspace.Model.ProjectInfo#1][SQL: INSERT INTO T_PROJECTRUN (Remarks, Remarks_TS, PRIDENT) VALUES (?, ?, ?)]
Source=NHibernate
SqlString=INSERT INTO T_PROJECTRUN (Remarks, Remarks_TS, PRIDENT) VALUES (?, ?, ?)
StackTrace:
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
at NHibernate.Action.EntityUpdateAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
at MyNamspace.RepositoryBase`2.ExecuteAsTransaction(Action action)
【问题讨论】:
标签: c# nhibernate nhibernate-mapping