问题
如何使用相同的.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主键插入表,我会遇到一些麻烦。
我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用ATTRIBUTE_LOCALE
生成器映射native
表,而不是identity
:
对于跨平台开发,本机策略将从身份,序列和hilo策略中进行选择,具体取决于底层数据库(ref)的功能。
Oracle不支持标识列的概念。如果您使用的是SQL Server 2012+,则可以使用序列而不是身份。这将与Oracle更加一致,并且可以说是ORM明智的更好的密钥生成策略。
答案 1 :(得分:0)
我的同事建议我调整表格架构。
CUID
和FIELD_NAME
RESOURCE_ID
和LOCALE_NAME
成为复合键。RESOURCE_ID
同时为复合键和外键。确实,上述方法可以解决我的问题,但我不认为这种数据模式设计是好还是不好。
如果有人对我有关此数据模式设计的任何建议,我将不胜感激。