我熟悉 Visual Studio 中的实体框架和代码优先设计,但我正在接触 Eclipse。 也就是说,我试图了解 eReference 属性的某些属性如何在 ecore 模型中转换。 具体来说,当我读到有关容器和遏制的内容时,我发现自己迷失了方向。 这些字段是否可以以某种方式转换为 SQL 外键关系或实体模型对象关系? 我可以很好地理解这两点。 具体来说,无论是 SQL 还是 EF 术语,container=true 时意味着什么,containment=true 时意味着什么。
我不熟悉 SQL 或 EF,但从我读到的内容来看,外键更像是 EReference(其他字段是 EAttribute,“主键”是 isID 设置为 true 的 EAttribute)。
Ecore 中的遏制是 EReference 的一个特例。关键部分是一个 EObject 只能被另一个 EObject 包含。我认为最好的方法是在一个简单的 Ecore 元模型上尝试一下!
基本上,任何具有 Containment=true 的 eOpposite 的 A 到 B 的关系都可以被视为两个 SQL 表 A 和 B,其中 B 对 A 有一个带有“删除级联”的外键约束,所以用经典的 UML 术语来说 compositions .
有关 EMF 语义的更多详细信息:
EMF 模型基本上是 树模型,具有将它们转换为图形的附加边。容器和包含管理模型的主干,即底层树结构: 除了根类型和外部定义类型之外的每个类型都需要(传递地)包含。
您首先可以直接在 root 下定义类型,然后可以定义更多依赖于这些类型的类型。通常,您允许类型 A 包含 B 列表,并且每个 B 将其父连接维护为 1..1 连接。这是一个正常的树连接(有很多子节点,但只有一个父节点)。还可以定义与子级的 1 对 1 遏制连接 - 甚至可能是其他连接。
但是后续模型中的每个现有元素都只有一条通往模型根的路径,该路径沿着主干树中的包含向上。 其他不定义包含的关系不会向您的模型添加新元素,而只是定义现有元素之间的(有用的)连接。