Entity framework 无法强制转换类型为“System.Collections.Generic.HashSet”的对象

Entity framework 无法强制转换类型为“System.Collections.Generic.HashSet”的对象,entity-framework,ef-code-first,code-first,Entity Framework,Ef Code First,Code First,我试图先用这些类和EF代码将数据添加到数据库中。填充对象并尝试填充上下文dbContext.Tracks.Addt1之后。我遇到错误,无法将'System.Collections.Generic.HashSet'1[Vinyl7]'类型的对象强制转换为'Vinyl7'类型。有人能指出我缺少什么吗 Public Class Vinyl7 <Key> Public Overridable Property mediaId As Long Public Overr

我试图先用这些类和EF代码将数据添加到数据库中。填充对象并尝试填充上下文dbContext.Tracks.Addt1之后。我遇到错误,无法将'System.Collections.Generic.HashSet'1[Vinyl7]'类型的对象强制转换为'Vinyl7'类型。有人能指出我缺少什么吗

Public Class Vinyl7

    <Key>
    Public Overridable Property mediaId As Long
    Public Overridable Property parentMediaId As System.Nullable(Of Long)
    Public Overridable Property side As String

    <ForeignKey("mediaId"), Required>
    Public Overridable Property track As Track

End Class


Public Class Track

    <Key>
    Public Property mediaId As Long
    Public Property title As String

    Public Overridable Property Vinyl7T As ICollection(Of Vinyl7) = New HashSet(Of Vinyl7)
End Class
这是我的方法

        Using db = New MediaRepo
            Dim t1 = New Track
            t1.title = "Kutchie"
            Dim t2 = New Track
            t2.title = "Drug Trade"

            Dim a = New Media.Vinyl7
            a.side = "A"
            a.parentMediaId = t1.mediaId
            a.track = t1
            Dim b = New Media.Vinyl7
            b.side = "B"
            b.parentMediaId = t1.mediaId
            b.track = t2
            t1.Vinyl7T.Add(a)
            t1.Vinyl7T.Add(b)
            db.Tracks.Add(t1)

            SaveChanges(db)

        End Using

我认为你的注释是错误的。您正在引用mediaId作为跟踪的外键,但这是Vinyl7实体的主键。你可能是说parentMediaId,对吧

用此更新您的乙烯基7实体,它将起作用:

   <Key>
    Public Overridable Property mediaId As Long       
    Public Overridable Property side As String

    <ForeignKey("mediaId"), Required>
    Public Overridable Property track As Track
编辑

根据您的评论,我已更新为1..0:1关系

做了一个快速测试的应用程序,你能把它和你拥有的进行比较吗?也许你有一些额外的东西让你困惑

 Public Class Vinyl7

    <Key>
    Public Overridable Property mediaId As Long
    Public Overridable Property side As String

    <ForeignKey("mediaId"), Required>
    Public Overridable Property track As Track

End Class

Public Class Track
    <Key>
    Public Property trackid As Long
    Public Property title As String

    Public Overridable Property Vinyl7T As Vinyl7

End Class

Module Module1

    Public Class MediaRepo : Inherits DbContext

        Public Sub New()
        End Sub

        Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
        End Sub

        Public Property Vinyl7s As DbSet(Of Vinyl7)
        Public Property Tracks As DbSet(Of Track)

    End Class

    Sub Main()
        Dim db As New MediaRepo

        Dim vin = New Vinyl7
        Dim track As New Track

        track.Vinyl7T = vin

        db.Tracks.Add(track)
        db.SaveChanges()

    End Sub

End Module

我已经更新了它,但仍然打赌错误代码Public Overridable Property track为track我编写了一个与您的模型一起工作的testapp。也许你能看到你的代码有什么不同?尝试创建一个控制台应用程序并粘贴我的代码,它将创建数据库并能够插入一些实体谢谢马克,这让我有了很多方法。如果可以的话。我如何在Track_trackId和Vinyl7_mediaId之间建立一对一的关系我希望能够添加一个曲目,而不必添加一个vinyl。你现在拥有的是1..0对多,你应该能够添加一个没有乙烯基的曲目。但是,你不能添加没有音轨的乙烯基。问题是乙烯基和音轨没有相同的ID,所以我很难针对它编写SQL脚本。但是,如果它们可以共享相同的ID,我的脚本将从[MediaDb].[dbo].[Vinyl7]v internal join[MediaDb].[dbo]中编码选择v.*,m.title。在m.trackId=v.mediaId上跟踪m,其中v.parentMediaId=7
 Public Class Vinyl7

    <Key>
    Public Overridable Property mediaId As Long
    Public Overridable Property side As String

    <ForeignKey("mediaId"), Required>
    Public Overridable Property track As Track

End Class

Public Class Track
    <Key>
    Public Property trackid As Long
    Public Property title As String

    Public Overridable Property Vinyl7T As Vinyl7

End Class

Module Module1

    Public Class MediaRepo : Inherits DbContext

        Public Sub New()
        End Sub

        Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
        End Sub

        Public Property Vinyl7s As DbSet(Of Vinyl7)
        Public Property Tracks As DbSet(Of Track)

    End Class

    Sub Main()
        Dim db As New MediaRepo

        Dim vin = New Vinyl7
        Dim track As New Track

        track.Vinyl7T = vin

        db.Tracks.Add(track)
        db.SaveChanges()

    End Sub

End Module