2013-03-07 116 views
1

我想用EF Code-First将这些类添加到数据库中。填充对象并尝试填充上下文“dbContext.Tracks.Add(t1)”后。我收到错误“无法投射'System.Collections.Generic.HashSet`1 [Vinyl7]'类型的对象键入'Vinyl7'”任何人都可以指出我失踪了什么?无法投射“System.Collections.Generic.HashSet”类型的对象

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 

这是我的上下文

Public Class MediaRepo : Inherits DbContext 

    Public Sub New() 
     MyBase.New("name=MediaDB") 

    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 

这是我的方法。

 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 

回答

0

我认为你的注解是错误的。您将mediaId作为Track的外键,但这是您的Vinyl7实体的主键。你的意思可能是parentMediaId对不对?

更新您的Vinyl7实体与此,它会工作:

<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的关系。

作出了一个快速测试应用程序的工作,你能比较它与你有什么?也许你有些额外的东西让EF困惑?

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 
+0

因为我已经更新了,但仍押注错误'code' 公共属性可覆盖的轨道作为轨道 – ruffone 2013-03-07 04:08:09

+0

我写了一个testapp这就是你的模型工作。也许你可以看到你的代码有什么不同?尝试创建一个控制台应用程序并粘贴我的代码,它会创建数据库并能够插入一些实体 – 2013-03-07 04:12:29

+0

感谢马克,这已经让我有了一种方式'。如果允许我的话。我如何制作我认为Track_trackId和Vinyl7_mediaId之间的一对一关系我希望能够在不添加乙烯基的情况下添加曲目 – ruffone 2013-03-07 08:46:50

相关问题