基本表设计中的外键约束异常

Posted

技术标签:

【中文标题】基本表设计中的外键约束异常【英文标题】:Foreign key constraint exception in basic table design 【发布时间】:2017-11-10 09:21:14 【问题描述】:

我正在使用 Entity Framework Core 并且有一个简单的 5 表设计,但出现错误并且无法弄清楚原因。我错过了什么?

例外:

引入 FOREIGN KEY 约束 'FK_GraphicItems_GraphicUploadTemplateItems_GraphicUploadTemplateItemId' 在表 'GraphicItems' 上可能会导致循环或多个级联路径。 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

基地:

public abstract class Base

    public int Id  get; set; 
    public DateTime DateCreated  get; set;  = DateTime.Now;

客户:

public class Client : Base

    public Guid Key  get; set; 
    public string Name  get; set; 

图形:

public class Graphic : Base

    public int ClientId  get; set; 
    public virtual Client Client  get; set; 
    public ICollection<GraphicItem> Items  get; set;  = new HashSet<GraphicItem>();
    public ICollection<Tag> Tags  get; set;  = new HashSet<Tag>();

GraphicItem: (GraphicUploadTemplateId 属性导致异常)

public class GraphicItem : Base

    public int GraphicId  get; set; 
    public virtual Graphic Graphic  get; set; 
    public int GraphicUploadTemplateItemId  get; set; 
    public virtual GraphicUploadTemplateItem UploadTemplateItem  get; set; 

GraphicUploadTemplate:

public class GraphicUploadTemplate : Base

    public int ClientId  get; set; 
    public virtual Client client  get; set;     
    public ICollection<GraphicUploadTemplateItem> Items  get; set; 

GraphicUploadTemplateItem:

public class GraphicUploadTemplateItem : Base

    public int GraphicUploadTemplateId  get; set; 
    public virtual GraphicUploadTemplate UploadTemplate  get; set; 

【问题讨论】:

Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?的可能重复 【参考方案1】:

已经通过GraphicItem.UploadTemplateItem.Id会有一个指向相应GraphicUploadTemplateItem的链接,我认为这会导致循环引用。

【讨论】:

啊,是的,当然!抱歉我瞎了;)谢谢!【参考方案2】:

通过将属性类型设置为可空来解决问题

public class GraphicItem : Base

    public int GraphicId  get; set; 
    public virtual Graphic Graphic  get; set; 
    public int? GraphicUploadTemplateItemId  get; set; 
    public virtual GraphicUploadTemplateItem UploadTemplate  get; set; 

【讨论】:

以上是关于基本表设计中的外键约束异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在删除时处理 MySql + Laravel 中的外键约束?

Yesod / Persistent中的外键约束?

SQLSTATE [HY000] Laravel 8 中的外键约束格式错误

此表中的外键约束有啥问题?

sql。两个间的外键约束和插入数据问题

数据库 两表互为外键,如何添加数据