RIA не загружает дочерние объекты с помощью RIA и Silverlight - PullRequest
2 голосов
/ 24 октября 2011

У меня проблемы с загрузкой некоторых дочерних атрибутов данного объекта.Мне удалось загрузить дочерние объекты на другие объекты, но не этот.Чтобы добавить к разочарованию, ссылки на дочерние сущности, которые я пытаюсь загрузить, ссылаются на другую сущность, и из этого они работают нормально ...

Мой код выглядит следующим образом.

Страница ViewWasteApplication

Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)

    If NavigationContext.QueryString.ContainsKey("ID") Then

        ' load an existing record - edit mode
        Context.Load(Context.GetWasteApplicationsByIDQuery(Int32.Parse(NavigationContext.QueryString("ID").ToString())),
                     AddressOf wasteApplicationLoaded, Nothing)
    Else
        MessageBox.Show("Application not found")
    End If

End Sub

Это вызывает GetWasteApplicationsByID - что выглядит следующим образом:

Public Function GetWasteApplicationsByID(ByVal query As Int32) As IQueryable(Of WasteApplication)
    Dim result = Me.ObjectContext.WasteApplications.Include("CurrentlyWith") _
                                             .Include("Packaging") _
                                             .Include("WasteStream") _
                                             .Where(Function(f) f.ID = query)
    Return result
End Function

WasteApplication возвращается, но ни один из3 дочерних объекта появляются.

Я создал класс MetaData для этого приложения WasteApplication следующим образом:

<MetadataTypeAttribute(GetType(WasteApplications.WasteApplicationsMetaData))> _
Partial Public Class WasteApplications


Friend NotInheritable Class WasteApplicationsMetaData

    'Metadata classes are not meant to be instantiated.
    Private Sub New()
        MyBase.New()
    End Sub

    Public Property ID As Integer
    Public Property RequestedByName As String
    Public Property RequestedByExtension As String
    Public Property CARQRequired As Boolean
    Public Property OriginOfMaterialID As Integer
    Public Property Comments As String
    Public Property MaterialName As String
    Public Property PackagingID As Integer
    Public Property FacilityPath As String
    Public Property ProcessStatus As String
    Public Property DateSubmitted As DateTime
    Public Property RequestedByUsername As String
    Public Property CurrentlyWithID As Integer
    Public Property WasteStreamID As Integer

    <Include()>
    Public Property WasteStream As WasteStreams

    <Include()>
    Public Property Packaging As Packaging


End Class
End Class

Может кто-нибудь увидеть что-то не так с этим?Я загружаю те же два дочерних объекта на другую страницу, и они, кажется, загружаются просто отлично.Код для этого следующий:

Просмотр химической заявки (это работает)

Protected Overrides Sub OnNavigatedTo(ByVal e As   System.Windows.Navigation.NavigationEventArgs)
         Context.Load(Context.GetChemicalApplicationsByIDQuery(Int32.Parse(NavigationContext.QueryString("ID"))),
                     AddressOf wasteApplicationLoaded, Nothing)

End Sub

С функцией RIA следующим образом:

Public Function GetChemicalApplicationsByID(ByVal query As Int32) As IQueryable(Of ChemicalApplication)
    Return Me.ObjectContext.ChemicalApplications.Include("Chemical") _
                                                .Include("ProcessStatus") _
                                                .Include("PlanningApprover") _
                                                .Include("FacilitiesApprover") _
                                                .Include("MaintenanceApprover") _
                                                .Include("PPCPermit") _
                                                .Include("DischargeConsent") _
                                                .Include("Facility") _
                                                .Include("Packaging") _
                                                .Include("WasteStream") _
                                                .Where(Function(f) f.ID = query)
End Function

Есть предложения?

ПРИМЕЧАНИЕ. Я не разместил ни одной из привязок XAML, поскольку подтвердил отладкой, что исходные сущности не содержат дочерние данные, поэтому привязка не будет проблемой.

Я использую Silverlight 4 с Entity Framework 4.

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Вам потребуется создать классы метаданных для сущностей, которые вы хотите включить, и пометить поля атрибутом [Include].

[MetadataTypeAttribute(typeof(Client.ClientMetadata))]
public partial class Client
{
    internal sealed class ClientMetadata
    {
        private ClientMetadata()
        {
        }

        [Required(ErrorMessage="You must enter a client name")]
        public string Name;

        [Include]
        public EntityCollection<Contact> Contacts;

        [Include]
        public Employee Employee;

        [Include]
        public BillTo BillTo;
    }
    }

Подробнее см. RIA Services и реляционные данные .

1 голос
/ 27 декабря 2011

Вам нужно сделать 2 следующие вещи, чтобы это работало:

a) Добавить параметр включения в класс метаданных (как предложил DaveB)

b) в запросах службы домена (на стороне сервера) добавьте директиву include - Me.ObjectContext.WasteApplications.Include ("CurrentWith")

0 голосов
/ 25 октября 2011

Мне удалось решить проблему, вам нужно загрузить соответствующие объекты в текстовый текст, а также загрузить связанный объект. т.е. в моем случае мне нужно добавить:

Context.Load(Context.GetWasteStreamsQuery())
Context.Load(Context.GetPackagingQuery())

так что связанные дочерние сущности существуют. Поэтому мой полный onNavigate выглядит так:

Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)

    If NavigationContext.QueryString.ContainsKey("ID") Then


        Context.Load(Context.GetWasteApplicationsByIDQuery(Int32.Parse(NavigationContext.QueryString("ID").ToString())),
                 AddressOf wasteApplicationLoaded, Nothing)

        Context.Load(Context.GetWasteStreamsQuery())
        Context.Load(Context.GetPackagingQuery())
    Else
        MessageBox.Show("Application not found")
    End If

End Sub
...