【问题标题】:Linq to Sql Insertion conflict with "Foreign Key Same Table constraint" errorLinq to Sql 插入冲突与“外键同表约束”错误
【发布时间】:2012-06-03 19:51:48
【问题描述】:

我正在使用 Linq 2 Sql 快速定制 CMS。

我有一个与自身关联的表,因此任何子菜单都映射到同一个表中的任何父菜单,但我在插入第一个父菜单时遇到问题。

表格看起来有点像这样:

CMSMenu
     CMSMenuID
     ParentCMSMenuID    
     Name
     Link

的关联
CMSMenu.CMSMenuID -> CMSMenu.ParentCMSMenuID

在以前版本的数据库/代码中,我只需添加一些代码,例如:

  itm = new CMSMenu();
  itm.ParentCMSMenuID = 0; 
  rep.CMSMenus.InsertOnSubmit(itm);

但是由于这个数据库是使用所有外键自动创建的,所以这段代码会导致异常:

INSERT 语句与 FOREIGN KEY SAME TABLE 冲突 约束“CMSMenu_CMSMenu”。数据库发生冲突 “sp.ackahs”,表“dbo.CMSMenu”,列“CMSMenuID”。该声明 已终止。

如何插入顶级菜单(即没有父级)?

因为它没有父母所以我不能添加:

itm.MyParentCMSMenu=*existing cmsmenu item*;

我可以使用子菜单,也不能添加:

itm.MyParentCMSMenu=null;

欢迎任何想法。

谢谢 托比

【问题讨论】:

  • 能否在 SQL 中将 MyParentCMSMenu 设置为可为空的列?
  • 是的......我觉得有点傻,我期待这会导致关联中的错误,因为 CMSMenuID 不能为空,而 ParentCMSMenuID 可以。谢谢你。

标签: c# asp.net linq-to-sql


【解决方案1】:

尝试在 SQL 中将 MyParentCMSMenu 设置为可为空的列。

【讨论】:

    【解决方案2】:

    通常使用特殊版本的 CMSMenu 项。它可能被命名为“null”并且 ID 为 0 或 1。它应该用作实际上没有父项的项的父项。它应该从所有查询中过滤掉。

    这是关系数据库的弱点之一——您需要使用各种怪癖来存储像树这样的简单抽象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多