Search code examples
vb.netwcfdatacontract

Object with List(Of Object) in WCF. When add to Object, get NullReferenceException


I have a DataContract as followed:

<DataContract()> _
Public Class PrivateProfile
 ' This member is serialized.
<DataMember()> _
Public UserAccount As UserAccount
<DataMember()> _
Public ProfileName As String = ""
<DataMember()> _
Public Birthday As Date?
<DataMember()> _
Public Gender As Int16 = 0
<DataMember()> _
Public AboutMe As String = ""
<DataMember()> _
Public Locations As New List(Of Location)
<DataMember()> _
Public Contacts As New List(Of Contact)
End Class

The Contact is:

<DataContract()> _
Public Class Contact


' This member is serialized.
<DataMember()> _
Public Value As String
<DataMember()> _
Public ContactTypes_ContactTypeId As Int16
<DataMember()> _
Public PrivatePs As New List(Of PrivateProfile)


End Class

On Client Side I use the following code:

Dim svcProfile As New svcProfiles.ProfilesClient
.....

Dim pprofile As New svcProfiles.PrivateProfile
.....

Dim co As New svcProfiles.Contact

        co.Value = "34234234234"
        co.ContactTypes_ContactTypeId = 1

        pprofile.Contacts.Add(co)

As soon i get to Add the contact to the Profile (last line), i get a NullReferenceException. Contacts is allways nothing, but i dont know why.

Any Idea... googled a lot...

Edit: When i run in same situation on wcf implementation (server) side i get into same problem:

If pprofile.Contacts.Count > 0 Then 

    Dim co As New contracts.Contact 

    For Each co In pprofile.Contacts 

        Dim con As New ef.Contact()

        con.ContactTypes_ContactTypeId = co.ContactTypes_ContactTypeId 
        con.Value = co.Value 
        con.PrivatePs.Add(pp) 
        context.Add(con) 

    Next 

    context.SaveChanges() 

End If 

Solution

  • I suspect that the proxy class that is generated from your services is excluding the New keyword and just sets up the property type. You should be able to fix this in the calling code by instantiating it explicitly:

    Dim con As New ef.Contact()
    
    con.ContactTypes_ContactTypeId = co.ContactTypes_ContactTypeId 
    con.Value = co.Value 
    con.PrivatePs = New PrivatePs()
    con.PrivatePs.Add(pp) 
    context.Add(con) 
    

    If you are using the entity framework, you may want to check into the fixup code that they generate under the covers for navigation properties to make sure that they can synchronize correctly.