Как расширить NHibernate для поддержки большего количества баз данных? - PullRequest
3 голосов
/ 10 июля 2009

Если мне нужно, чтобы NHibernate поддерживал больше баз данных (не входит в список поддерживаемых: https://www.hibernate.org/361.html), при условии, что к базе данных можно получить доступ, используя встроенный язык запросов, но не SQL (пример: * 1003) *http://kx.com/Products/kdb+.php)...

  • Как я смогу заставить NHibernate работать с этими базами данных?

1 Ответ

9 голосов
/ 10 июля 2009

NHibernate предназначен для работы с диалектами SQL, а не с специальными языками запросов. Это будет очень сложно сделать. Но чтобы ответить на ваш вопрос, вам необходимо:

  1. Поставщик ADO.NET для вашей базы данных (это будет отдельный вопрос).
  2. Класс драйвера (производный от DriverBase NHibernate). Вот что я написал в прошлом (несколько анонимно):

    public sealed class XxxClientDriver : DriverBase
    {
        public override IDbConnection CreateConnection()
        {
            return XxxClientFactory.Instance.CreateConnection();
        }
        public override IDbCommand CreateCommand()
        {
            return XxxClientFactory.Instance.CreateCommand();
        }
        public override bool UseNamedPrefixInSql
        {
            get { return true; }
        }
        public override bool UseNamedPrefixInParameter
        {
            get { return true; }
        }
        public override string NamedPrefix
        {
            get { return "@"; }
        }
    }
    
  3. Возможно (определенно в вашем случае) диалект, производный от класса Dialect NHibernate, который определяет классы для визуализации каждого конкретного элемента синтаксиса в вашем языке (заметьте, однако, что это все еще ориентируется на SQL, Подозреваю, где вы собираетесь упасть здесь). Пример в моем случае:

    public sealed class XxxDialect : Dialect
    {
        public override JoinFragment CreateOuterJoinFragment()
        {
            return new XxxJoinFragment();
        }
    }
    
  4. Столько элементов нестандартного синтаксиса (по сравнению с обычным SQL), сколько имеется в вашем языке. Опять пример из моего дела:

    public sealed class XxxJoinFragment : JoinFragment
    {
        private readonly SqlStringBuilder _afterFrom;
        public XxxJoinFragment()
        {
            _afterFrom = new SqlStringBuilder();
        }
        private SqlStringBuilder AfterFrom
        {
            get { return _afterFrom; }
        }
        public override SqlString ToFromFragmentString
        {
            get { return _afterFrom.ToSqlString(); }
        }
        public override SqlString ToWhereFragmentString
        {
            get { return SqlString.Empty; }
        }
        public override void AddJoin(string tableName, string alias,
            string[] fkColumns, string[] pkColumns,
            JoinType joinType)
        {
            AddCrossJoin(tableName, alias);
        }
        public override void AddJoin(string tableName, string alias,
            string[] fkColumns, string[] pkColumns,
            JoinType joinType, string on)
        {
            AddJoin(tableName, alias, fkColumns, pkColumns, joinType);
        }
        public override void AddCrossJoin(string tableName, string alias)
        {
            AfterFrom.Add(", ").Add(tableName).Add(" ").Add(alias);
        }
        public override void AddJoins(SqlString fromFragment, SqlString whereFragment)
        {
            AddFromFragmentString(fromFragment);
        }
        public override bool AddCondition(string condition)
        {
            return true;
        }
        public override bool AddCondition(SqlString condition)
        {
            return true;
        }
        public override void AddFromFragmentString(SqlString fromFragmentString)
        {
            AfterFrom.Add(fromFragmentString);
        }
    }
    

Как вы можете видеть, в моем случае (язык запросов на основе SQL с неявными условиями соединения) это было не слишком сложно. Но в вашем случае я подозреваю, что вы будете против этого. Удачи!

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