代码之家  ›  专栏  ›  技术社区  ›  Goblin

如何写入不在域实体中的列?

  •  1
  • Goblin  · 技术社区  · 14 年前

    为了控制访问,我们有一个列来描述这种关系。但是,此列不在域模型中表示。我知道仅查询属性-因此,对于查询-它工作得非常好。

    但是,保存新行/实体时如何写入此列?

    代码:

    public class Customer
    {
        public virtual long Id{get;private set;}
        public virtual string AccountNumber{get;set;}
    }
    

    映射:

    <class Name="Customer">
      <id name="Id">
        <generator class="native"/>
      </id>
      <property name="AccountNumber"/>
      <property name="Partition" access="noop" not-null="true"/>
    </class>
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Pascal Thivent    14 年前

    如果在创建实体时没有设置,我不确定应该插入的值从何而来(当然假设它们会提供适当的属性),但是。。。

    一种选择是使用 IInterceptor 在运行期间更改SQL OnPrepareStatement 如果需要插入,可以添加任何内容。

    using System;
    using System.Collections;
    using NHibernate.SqlCommand;
    using NHibernate.Type;
    
    namespace NHibernate
    {
        [Serializable]
        public class MyInterceptor : IInterceptor
        {
            ...
    
            public SqlString OnPrepareStatement(SqlString sql)
            {
                ///Do what is required here to alter the SQL string
                return sql;
            }
        }
    }
    

    参考

        2
  •  1
  •   Nathan Fisher    14 年前

    将分区属性作为域的一部分是否有问题?

    就我个人而言,我会把它作为域模型的一部分来添加,这样你就省去了很多痛苦。我们对这个问题的有限看法是,Partion属性作为域的一部分,或者作为customer对象的一部分,或者被重构为customer的超类,似乎会对您有所裨益。

    既然如此,如果它必须保持原样,那就考虑实施这两种方法中的任何一种 IPreInsertEventListner / IPreUpdateEventListener 或者 IPostInsertEventListener / IPostUpdateEventListener 您可以检查Customer类并执行SQL查询来更新数据库中的分区列。似乎大多数人都将这些事件处理程序用于审计日志记录,但它们仍应适用于这种情况。

    Ayende's Blog - NHibernate IPreUpdateEventListener & IPreInsertEventListener