添加两个FK指向彼此的实体

时间:2010-10-22 04:01:49

标签: c# asp.net-mvc linq-to-sql entity-framework linq-to-entities

我的应用程序中有两个表。第一部分是Sections,它存储在线出版物特定部分的内容。这包含(除其他外)节标题和字段CurrentRevisionId(FK)。

第二个表“修订”存储该内容的不同修订版。它有PK RevisionId字段(上面的FK,用于表示当前版本),HTML内容本身和SectionId(FK),指定修订所属的部分。

所以基本上我已经让这两个FK指向对方了。当我创建一个新的Section时,子实体CurrentRevision也会填充该内容。但是InsertOnSubmit失败并出现此错误:

  

INSERT语句与FOREIGN KEY约束“FK_Sections_Revisions”冲突。冲突发生在数据库“xxxx”,表“xxxx.Sections”,列“SectionID”中。声明已经终止。

我的猜测是它不能同时创建两行并用彼此的PK填充它们。

我应该首先插入Section,然后是Revision(以及Section的PK),然后使用Revision PK更新Section?或者是否有更好/更优雅的解决方案?

编辑:我已经附上了两张桌子的屏幕截图及其关系。每个部分都有许多修订版(Revisions表中的FK SectionID)。此外,还有一对一的关系,其中Section中的CurrentRevisionId字段指向“当前”的修订版。这个“当前”修订版是应用程序从中提取HTML的地方。希望能稍微澄清一下。

alt text

2 个答案:

答案 0 :(得分:2)

你不能让两张桌子互相指向FK;没有意义。

如果您尝试建模多对多关系,则需要在两个表之间创建映射表。它将包含(至少)两个外键,每个主表键一个。

答案 1 :(得分:1)

如果修订内容存储在REVISIONS表中,那么我不需要在SECTIONS表中找到RevisionID字段。

当为同一部分创建不同的修订版时,可以将新行添加到REVISIONS表,其中FK(SectionID)引用SECTIONS表。

SECTIONS: SectionID(PK) | SectionData ..

修订: RevisionID(PK)| SectionID(FK) | RevisionData ...