【问题标题】:NHibernate dictionary mapping without primary key没有主键的 NHibernate 字典映射
【发布时间】:2017-06-28 06:15:50
【问题描述】:

问题
如何使用相同的.hbm配置映射字典集合跨数据库?

场景
我正在尝试映射字典属性:

Dictionary<string, string> Phrases { set; get; }

使用以下 .hbm 配置:

<map
    name="Phrases"
    cascade="save-update"
    table="ATTRIBUTE_LOCALE"
    lazy="true">
        <key column="RESOURCE_ID" /> <!-- foreign key -->
        <index column="LOCALE_NAME" type="string" />
        <element column="PHRASE" type="string" />
</map>

下面是MS SQL的[ATTRIBUTE_LOCALE]的表创建SQL:

CREATE TABLE ATTRIBUTE_LOCALE ( 
    CUID int IDENTITY(1, 1) NOT NULL,
    RESOURCE_ID int NOT NULL,
    FIELD_NAME nvarchar(255) DEFAULT 'VALUE' NOT NULL,
    LOCALE_NAME nvarchar(255) NOT NULL,
    PHRASE ntext NULL
);

但如果我将数据库从 MS SQL Server 更改为 Oracle 并且 Oracle 数据库无法使用 IDENTITY(1, 1) 自动生成主键。在 Oracle 中,由于插入主键为 NULL 的表,我会遇到一些麻烦。

我该如何解决这个问题?

【问题讨论】:

    标签: c# mysql oracle nhibernate


    【解决方案1】:

    您可以使用native 生成器而不是identity 映射ATTRIBUTE_LOCALE 表:

    对于跨平台开发,原生策略会根据底层数据库(ref)的能力从identity、sequence和hilo策略中进行选择。

    Oracle 不支持标识列的概念。如果您使用的是 SQL Server 2012+,则可以使用序列而不是标识。这将与 Oracle 更加一致,并且可以说是一种更好的 ORM 密钥生成策略。

    【讨论】:

    • 在我的要求中,ATTRIBUTE_LOCALE 必须映射一个 Dictionary 属性。我无法为 ATTRIBUTE_LOCALE 添加 .hbm 和域。此外,包含此 的 .hbm 配置已使用原生生成器来处理 oracle 的主键。
    【解决方案2】:

    我的同事建议我调整表架构。

    1. 删除列CUIDFIELD_NAME
    2. RESOURCE_IDLOCALE_NAME 成为复合键
    3. RESOURCE_ID同时是复合键和外键

    确实,上述方法可以解决我的问题,但我不认为这种数据模式设计好不好。

    如果有人对这个数据架构设计有任何建议,我将不胜感激。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多