0

我首先在 EF6 代码中有一个相当复杂的数据库模型(大约 100 个实体)。其中一个实体称为“Base”,另一个称为“BaseAssociation”。“BaseAssociation”在“Base”对象之间建立多对多关系。附加到“BaseAssociation”对象的是“BaseAssociationAttribute”对象,它们为关联提供元数据。

“BaseAssociation”包含对“Base”表的两个引用,“AssociatedBy”和“AssociatedWith”。在使用 Devart dotConnect (8.4.215) 在 Oracle 数据库上创建数据库模型时,两个引用的外键约束具有相同的名称。通常,命名由实体类型和属性名称组成。但不知何故,这在我的情况下似乎被打破了。dotConnect 生成以下 sql:

ALTER TABLE "BaseAssociations"
  ADD CONSTRAINT "FK_Base_BaseAssociation" FOREIGN KEY ("AssociatedByRef") REFERENCES "Base" ("Id")
ALTER TABLE "BaseAssociations"
  ADD CONSTRAINT "FK_Base_BaseAssociation" FOREIGN KEY ("AssociatedWithRef") REFERENCES "Base" ("Id")

不知何故,两个外键都被赋予了相同的约束名称。

虽然在 sql server 设置上执行,但一切正常。不知何故,我无法使用更简单的模型重现这一点,并且所有其他约束名称都遵循默认模式。我没有触及任何代码优先约定,但启用了“截断长默认名称”、“忽略模式名称”和“列类型大小写约定兼容性”。

我正在使用 EF6.1.1,点连接 8.4.215

有人有想法吗?谢谢

4

1 回答 1

0

没有办法做到这一点。但无论如何,约束名称并不是那么相关,您可以为每个名称添加一种后缀,例如 FK_1、FK_2 ... FK_N。如果这很重要,您必须在不同的模式下创建表。

Oracle官方文档指出:

在命名空间内,没有两个对象可以具有相同的名称。

以下模式对象共享一个命名空间:

  • 意见
  • 序列
  • 私人同义词
  • 独立程序
  • 独立存储函数
  • 套餐
  • 物化视图
  • 用户定义类型

以下每个模式对象都有自己的命名空间:

  • 索引
  • 约束
  • 集群
  • 数据库触发器
  • 私有数据库链接
  • 方面

因为表和视图在同一个命名空间中,所以同一个模式中的表和视图不能具有相同的名称。但是,表和索引位于不同的命名空间中。因此,同一模式中的表和索引可以具有相同的名称。

于 2014-08-11T16:49:07.357 回答