实体框架更新外键约束可能会导致多个级联路径

时间:2016-02-02 12:03:22

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

我正在处理使用实体框架的项目,当我尝试更新数据库时,我收到以下错误。

  

介绍FOREIGN KEY约束' FK_dbo.VisualManualWebPageFiles_dbo.VisualManualHeaders_VisualManualHeaderID'在桌面' VisualManualWebPageFiles'可能会导致循环或多个级联路径。指定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

我有一种感觉问题出现在VisualManualWebPageFiles类中,因为VisualManualHeader的外键就好像我删除它然后我可以更新我的项目。

感谢。

2 个答案:

答案 0 :(得分:1)

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

如果情况确实如此,那么2个类之间的关系正确地表示在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

答案 1 :(得分:0)

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

示例:

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

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