没有主键的NHibernate字典映射

时间:2017-02-10 01:53:28

标签: c# mysql oracle nhibernate

问题
如何使用相同的.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主键插入表,我会遇到一些麻烦。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

  

对于跨平台开发,本机策略将从身份,序列和hilo策略中进行选择,具体取决于底层数据库(ref)的功能。

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

答案 1 :(得分:0)

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

  1. 删除列CUIDFIELD_NAME
  2. RESOURCE_IDLOCALE_NAME成为复合键
  3. RESOURCE_ID同时为复合键和外键
  4. 确实,上述方法可以解决我的问题,但我不认为这种数据模式设计是好还是不好。

    如果有人对我有关此数据模式设计的任何建议,我将不胜感激。