我正在处理使用实体框架的项目,当我尝试更新数据库时,我收到以下错误。
介绍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的外键就好像我删除它然后我可以更新我的项目。
感谢。
答案 0 :(得分:1)
我认为问题在于实体类的关联。看看您的代码似乎VisualManualHeader
和VisualManualPage
处于多对多关系中;即VisualManualHeader
的一个实例可以与VisualManualPage
的许多实例相关联,反之亦然。
如果情况确实如此,那么2个类之间的关系正确地表示在VisualManualWebPageFile
中,并且不需要在VisualManualHeader
和VisualManualPage
中保留不必要的属性。我试图删除如下:
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)可以通过其父级明确地识别其祖父母。