【问题标题】:Make an Entity Write-Only in NHibernate在 NHibernate 中使实体只写
【发布时间】: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


    【解决方案1】:

    你试过这样的吗?

    <class name="ProjectInfo" table="T_PROJECT" mutable="false">
    

    我认为它存在于 NHibernate 3.2 及之后,但不知道从什么时候开始。

    【讨论】:

    • 好的,谢谢!第一个测试似乎暗示,这解决了问题。
    • 我会的,经过更多测试;)
    • 我也会像 public string Customer { get; protected set; } 这样更改我的模型,因此您的代码甚至不应该尝试设置属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2011-04-07
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多