gpt4 book ai didi

c# - 如何扩展 NHibernate 以支持更多的数据库?

转载 作者:行者123 更新时间:2023-11-30 13:52:56 25 4
gpt4 key购买 nike

如果我需要让 NHibernate 支持更多的数据库(不包括在支持列表中:https://www.hibernate.org/361.html),假设可以使用它的内置查询语言访问数据库,但不能使用 SQL(例如:http://kx.com/Products/kdb+.php) )...

  • 我怎样才能让 NHibernate 与这些数据库一起工作?

最佳答案

NHibernate 旨在使用 SQL 的方言而不是ad hoc 查询语言进行操作。这将是非常棘手的。但要回答您的问题,您需要:

  1. 您的数据库的 ADO.NET 提供程序(这是一个单独的问题)。
  2. 一个 Driver 类(派生自 NHibernate 的 DriverBase)。这是我过去写的一篇(有点匿名):

    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. 可能(绝对是你的情况)一个方言,派生自 NHibernate 的 Dialect 类,它定义了类来呈现你的语言中的每个特定语法元素(不过请注意,这仍然是面向 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 的查询语言,具有隐式连接条件)这并不太难。但就你而言,我怀疑你会反对它。祝你好运!

关于c# - 如何扩展 NHibernate 以支持更多的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com