【问题标题】:Entity Framework Update Foreign Key constraint may cause multiple cascade paths实体框架更新外键约束可能导致多个级联路径
【发布时间】:2016-02-02 12:03:22
【问题描述】:

我正在开发一个使用实体框架的项目,当我尝试更新我的数据库时出现以下错误。

在表“VisualManualWebPageFiles”上引入 FOREIGN KEY 约束“FK_dbo.VisualManualWebPageFiles_dbo.VisualManualHeaders_VisualManualHeaderID”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束。

这里是用于此的类。

首先使用 VisualManualHeader 类。

<Table("VisualManualHeaders")>
Public Class VisualManualHeader
    <Key>
    Public Property VisualManualHeaderID As Integer

    <Required>
    Public Property Name As String

    Public Overridable Property VisualManualPages As ICollection(Of VisualManualPage)
    Public Overridable Property VisualManualWebPageFiles As ICollection(Of VisualManualWebPageFile)
End Class

然后一个 VisualManualHeader 具有与之关联的 VisualManualPages,如下所示。

<Table("VisualManualPages")>
Public Class VisualManualPage
    Enum VisualManualPageType
        VIDEO
        IMAGE
        TEXT
        WEBPAGE
    End Enum

    <Key>
    Public Property VisualManualPageID As Integer

    <Required>
    Public Property Title As String

    Public Property VisualManualHeaderID As Integer
    <ForeignKey("VisualManualHeaderID")>
    Public Overridable Property VisualManualHeader As VisualManualHeader

    Public Property Content As String

    Public Property PageType As VisualManualPageType

    Public Overridable Property VisualManualWebPageFiles As ICollection(Of VisualManualWebPageFile)
End Class

然后页面可以有许多与页面关联的 VisualManualWebPageFiles。

<Table("VisualManualWebPageFiles")>
Public Class VisualManualWebPageFile
    <Key>
    Public Property VisualManualWebPageFileID As Integer

    <Required>
    Public Property VisualManualHeaderID As Integer
    <ForeignKey("VisualManualHeaderID")>
    Public Overridable Property VisualManualHeader As VisualManualHeader

    <Required>
    Public Property VisualManualPageID As Integer
    <ForeignKey("VisualManualPageID")>
    Public Overridable Property VisualManualPage As VisualManualPage

    Public Property FileLocation As String
End Class

由于 VisualManualHeader 的外键,我感觉问题出在 VisualManualWebPageFiles 类中,好像我删除了它,然后我可以更新我的项目。

谢谢。

【问题讨论】:

    标签: sql .net vb.net entity-framework entity-framework-6


    【解决方案1】:

    我认为问题在于实体类的关联。看看你的代码,VisualManualHeaderVisualManualPage 似乎是多对多关系;即VisualManualHeader 的一个实例可以与VisualManualPage 的多个实例相关联,反之亦然。

    如果确实如此,那么VisualManualWebPageFile 中正确表示了两个类之间的关系,并且无需在VisualManualHeaderVisualManualPage 中保留不必要的属性。我试图删除相同的内容:

    VisualManualHeader

    <Table("VisualManualHeaders")>
    Public Class VisualManualHeader
        <Key>
        Public Property VisualManualHeaderID As Integer
    
        <Required>
        Public Property Name As String
    
        Public Overridable Property VisualManualWebPageFiles As ICollection(Of VisualManualWebPageFile)
    End Class
    

    VisualManualPage

    <Table("VisualManualPages")>
    Public Class VisualManualPage
        Enum VisualManualPageType
            VIDEO
            IMAGE
            TEXT
            WEBPAGE
        End Enum
    
        <Key>
        Public Property VisualManualPageID As Integer
    
        <Required>
        Public Property Title As String
    
        Public Property Content As String
    
        Public Property PageType As VisualManualPageType
    
        Public Overridable Property VisualManualWebPageFiles As ICollection(Of VisualManualWebPageFile)
    End Class
    

    VisualManualWebPageFile

    <Table("VisualManualWebPageFiles")>
    Public Class VisualManualWebPageFile
        <Key>
        Public Property VisualManualWebPageFileID As Integer
    
        <Required>
        Public Property VisualManualHeaderID As Integer
        <ForeignKey("VisualManualHeaderID")>
        Public Overridable Property VisualManualHeader As VisualManualHeader
    
        <Required>
        Public Property VisualManualPageID As Integer
        <ForeignKey("VisualManualPageID")>
        Public Overridable Property VisualManualPage As VisualManualPage
    
        Public Property FileLocation As String
    End Class
    

    【讨论】:

      【解决方案2】:

      你基本上是对的。 WebPageFiles 不需要对 ManualHeader 表的引用 - 它实际上可能会导致错误。

      例子:

      ManualPage ID 10 归 ManualHeader 1 所有。您将 WebPageFiles ID 15 添加到 ManualPage 1 - 但只要 ManualHeader 3 存在,就没有什么能阻止您将 WebPageFiles.ManualHeaderID 设置为 3。您现在有一个 WebPageFile,它对它的祖父母是谁有点困惑。

      正确的方法是只设置父ID(ManualPage)。此父级将包含其父级 (ManualHeader) 的 ID,因此子级 (WebPageFile) 可以通过其父级明确地找到其祖父级。

      【讨论】:

        猜你喜欢
        • 2013-01-07
        • 2010-10-25
        • 2019-06-06
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多