Как использовать Nhibernate с переменными или динамическими именами таблиц как Jan08Tran, Feb08Tran, Mar08Tran

Ваш JSON недопустим. Look {"id": "00001",} И json_decode ($ json, false) должен быть.

рабочий раствор:

$json = '{
"result":0,
"status":[{"id":"00001"},
  {"id":"00002"},
  {"id":"00003"}
]
}';

$data = json_decode($json, false);

foreach ($data->status as $status){
    echo $status->id;
}
9
задан Sachin Chavan 7 February 2009 в 12:00
поделиться

6 ответов

У меня была аналогичная ситуация, когда я должен был предоставить интерфейс между приобретенными приложениями, которые находились в производстве и использовались множеством различных систем. В этой системе были разные имена таблиц в dev, test и prod (смешно ...) Мое решение заключалось в том, чтобы оставить заполнитель для номера таблицы в конфигурации NHibernate, например:

<class name="MyClass" table="MyTable[tableNumber]">

А затем реализовать INamingStrategy аналогично:

public class MyCustomNamingStrategy : INamingStrategy
{
    public string ClassToTableName(string className)
    {
        return DefaultNamingStrategy.Instance.ClassToTableName(className);
    }

    public string PropertyToColumnName(string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToColumnName(propertyName);
    }

    public string TableName(string tableName)
    {
        tableName = tableName.Replace("[tableNumber]", LocalSettings.TableNumber);
        return DefaultNamingStrategy.Instance.TableName(tableName);
    }

    public string ColumnName(string columnName)
    {
        return DefaultNamingStrategy.Instance.ColumnName(columnName);
    }

    public string PropertyToTableName(string className, string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToTableName(className, propertyName);
    }

    public string LogicalColumnName(string columnName, string propertyName)
    {
        return DefaultNamingStrategy.Instance.LogicalColumnName(columnName, propertyName);
    }
}

Затем установите стратегию именования в конфигурации:

myConfiguration.SetNamingStrategy(new MyCustomNamingStrategy());

Таким образом, номер таблицы может быть сохранен в App.config, и приложение может перемещаться между средами, изменяя только значения в App.config. Я'

20
ответ дан 4 December 2019 в 08:53
поделиться

У меня была та же самая проблема, и мой подход должен был обновить значения конфигурации NHIBERNATE во времени выполнения. Таким образом я мог решить, с какой из моих многих тождественно именованных таблиц я буду говорить. Основанием техники является этот:-

private static void SetTableMapping(Configuration config, 
     Type persistentClass, string newTableName)
{
    PersistentClass classMapping = config.GetClassMapping(persistentClass);
    Table physicalTable = classMapping.RootTable;
    physicalTable.Name = newTableName;
}
2
ответ дан 4 December 2019 в 08:53
поделиться

Искавший много, но ничто определенное было доступно, наконец ступил линию за линией throgh источник NHibernate и нашел следующее решение. Это не легко, но все еще имеет работу вокруг.

  1. Создайте новый класс SqlInterceptor который реализует IInterceptor
  2. В OnPrepareStatement метод можно изменить Sql, как Вы хотите
  3. Затем добавьте этот SqlInterceptor к сессии хотя configuration.SetInterceptor(new SqlInterceptor());

Следующее является кодом для SqlInterceptor

using System;
using System.Collections;
using NHibernate.SqlCommand;
using NHibernate.Type;

namespace NHibernate
{
    [Serializable]
    public class SqlInterceptor : IInterceptor
    {
        public virtual void OnDelete(object entity, object id, object[] state, string[] propertyNames, IType[] types)
        {
        }

        public void OnCollectionRecreate(object collection, object key)
        {
        }

        public void OnCollectionRemove(object collection, object key)
        {
        }

        public void OnCollectionUpdate(object collection, object key)
        {
        }

        public virtual bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState,
                                         string[] propertyNames, IType[] types)
        {
            return false;
        }

        public virtual bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
        {
            return false;
        }

        public virtual bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
        {
            return false;
        }

        public virtual void PostFlush(ICollection entities)
        {
        }

        public virtual void PreFlush(ICollection entitites)
        {
        }

        public virtual bool? IsTransient(object entity)
        {
            return null;
        }

        public virtual object Instantiate(string clazz, EntityMode entityMode, object id)
        {
            return null;
        }

        public string GetEntityName(object entity)
        {
            return null;
        }

        public object GetEntity(string entityName, object id)
        {
            return null;
        }

        public virtual int[] FindDirty(object entity, object id, object[] currentState, object[] previousState,
                                       string[] propertyNames, IType[] types)
        {
            return null;
        }

        public virtual void AfterTransactionBegin(ITransaction tx)
        {
        }

        public virtual void BeforeTransactionCompletion(ITransaction tx)
        {
        }

        public virtual void AfterTransactionCompletion(ITransaction tx)
        {
        }

        public virtual void SetSession(ISession session)
        {
        }

        public SqlString OnPrepareStatement(SqlString sql)
        {
            ///Do something fancy here like  
            ///sql.Replace("_MonTranTable_", MonthName + "Tran");
            return sql;
        }
    }
}
1
ответ дан 4 December 2019 в 08:53
поделиться

Святой # % $ ^!=)

Я считаю, что это может быть достигнуто с пользовательским IEntityPersister, но это не было бы никакой легкой задачей.

Я не уверен в этом, но являюсь обновляемым представлением какой-либо справки?

0
ответ дан 4 December 2019 в 08:53
поделиться

Это не прямой ответ на Ваш вопрос, но возможно это может быть решение, в конце концов.

Возможно, можно ли добавить представление или два к DB, который заставит все те динамические таблицы быть похожими на тот?

0
ответ дан 4 December 2019 в 08:53
поделиться

Еще одна опция состоит в том, чтобы или использовать пользовательский SQL, чтобы сделать персистентность или записать sprocs для обработки постоянно меняющихся имен таблиц.

0
ответ дан 4 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: