Как записать в столбец не в доменном объекте? - PullRequest
1 голос
/ 03 сентября 2010

В нашем приложении SOA у нас есть данные нескольких клиентов в одной базе данных и в одних и тех же таблицах.

Для контроля доступа у нас есть столбец, который описывает это отношение. Однако этот столбец не представлен в модели предметной области. Я знаю о свойствах только для запросов - так что для запросов - он работает отлично.

Однако, как мне записать в этот столбец при сохранении новых строк / сущностей?

Код:

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 ]

1 голос
/ 06 сентября 2010

Я не уверен, что понимаю, откуда будет взято значение, которое должно быть вставлено, если оно не установлено при создании сущностей (при условии, что они, конечно, предоставят соответствующий атрибут), но ...

Один вариантбыло бы использовать IInterceptor для изменения SQL во время OnPrepareStatement и добавить все, что вы хотите в случае INSERT.

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;
        }
    }
}

И применить ваш перехватчик либо на уровне сеанса, либо глобально.

Справочник

1 голос
/ 06 сентября 2010

Есть ли проблема в том, что свойство Partition является частью домена?

Лично я бы добавил это как часть модели предметной области и избавил бы себя от многих трудностей.У нас очень ограниченное представление о проблеме: кажется, что вы бы получили выгоду от свойства Partion, являющегося частью домена, либо как часть объекта customer, либо рефакторинга для суперкласса customer.

Имеясказал, что если он должен оставаться таким, какой он есть, посмотрите на реализацию IPreInsertEventListner / IPreUpdateEventListener или IPostInsertEventListener / IPostUpdateEventListener. Вы можете проверить класс Customer и выполнить запрос SQL, который обновляет столбец Partition в базе данных.Похоже, что большинство людей используют эти обработчики событий для ведения журнала аудита, но они все равно должны быть применимы для этой ситуации.

Блог Ayende - NHibernate IPreUpdateEventListener & IPreInsertEventListener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...