2011-05-25 3 views
0

В моей концептуальной модели моего объекта есть две таблицы, представляющие интерес: tblProducts и tblInstalledProducts.Entity Framework 4 - Объект навигационной собственности Null на стороне клиента

Каждый установленный продукт имеет внешний ключ ProductID, связывающий его с конкретным продуктом, который автоматически настраивался как свойство навигации.

В рамках услуги домена объекта У меня есть следующий запрос:

public IQueryable<tblInstalledProduct> GetInstalledProductsBySiteID(string SiteID) 
{ 
    ObjectSet<tblInstalledProduct> installedProducts = this.ObjectContext.tblInstalledProducts; 

    var filterBySite = 
     from p in installedProducts.Include("tblProduct") 
     where p.SiteID == SiteID 
     select p; 

    return filterBySite; 
} 

У меня есть DataGridView, связанный с DomainDataSource, выполненной с возможностью использовать этот запрос.

Когда я отлаживаю этот запрос, p.tblProduct и p.tblProductReference заполняются, как ожидалось. Проблема возникает при попытке получить доступ к свойству tblProduct любого tblInstalledProduct с клиентской стороны.

//Find associated install record for the selected product 
tblInstalledProduct selectedInstall = 
    Context.tblInstalledProducts.Where(
     p => p.SiteID == "Site1" && p.ProductID == 38 
    ).First(); 

    string productName = selectedInstall.tblProduct.ProductName; 

По какой-либо причине tblProduct всегда имеет значение null. Я пробовал .Include()/.Load() и, похоже, не может заставить его заполнить себя.

Почему tblInstalledProduct.tblProduct загружен, как ожидалось, на служебную сторону вещей, но, по-видимому, недоступен на стороне клиента?

Спасибо за чтение.

Edit:

XAML DataSource:

<telerik:RadDomainDataSource x:Key="InstalledProductsDataSource" 
     Name="InstalledProductsDataSource" 
     DomainContext="{StaticResource DomainContext}" 
     AutoLoad="True" 
     QueryName="GetInstalledProductsInfoBySiteID" 
     SubmittedChanges="InstalledProductsDataSource_SubmittedChanges"> 
    <telerik:RadDomainDataSource.QueryParameters> 
     <telerik:QueryParameter 
       ParameterName="SiteID" 
       Value="{Binding SelectedValue,ElementName=SiteList}" /> 
    </telerik:RadDomainDataSource.QueryParameters> 
</telerik:RadDomainDataSource> 

XAML DataGrid:

<telerik:RadGridView x:Name="InstalledProductsGridView" 
     ItemsSource="{Binding DataView, Source={StaticResource InstalledProductsDataSource}}"> 

    <telerik:RadGridView.Columns> 
     <telerik:GridViewDataColumn Header="Product Name" DataMemberBinding="{Binding ProductName, Mode=TwoWay}" /> 
     <telerik:GridViewDataColumn Header="Version" DataMemberBinding="{Binding ProductVersion, Mode=TwoWay}" /> 
     <telerik:GridViewDataColumn Header="Description" DataMemberBinding="{Binding Description, Mode=TwoWay}" /> 
    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 

Сейчас сетка привязывается к коллекции tblProducts, но я хотел бы, чтобы связать его к коллекции tblInstalledProducts (поскольку в этой таблице есть какая-то дополнительная информация, к которой мне нужен доступ):

<telerik:RadGridView.Columns> 
    <telerik:GridViewDataColumn Header="DateInstalled" DataMemberBinding="{Binding DateInstalled, Mode=TwoWay}" /> 
    <telerik:GridViewDataColumn Header="Product Name" DataMemberBinding="{Binding tblProduct.ProductName, Mode=TwoWay}" /> 
    <telerik:GridViewDataColumn Header="Version" DataMemberBinding="{Binding tblProduct.ProductVersion, Mode=TwoWay}" /> 
    <telerik:GridViewDataColumn Header="Description" DataMemberBinding="{Binding tblProduct.Description, Mode=TwoWay}" /> 
</telerik:RadGridView.Columns> 
+1

* "Я пытался .INCLUDE()" * - Так 'Context.tblInstalledProducts.Include ("tblProduct") .гд (' не работает –

+0

, почему вы не звонили GetInstalledProductsBySiteID на стороне клиента? ? –

+0

@BlueRaja: System.ServiceModel.DomainServices.Client.EntitySet 'не содержит определения для' Include ' @Waleed: Я использую этот запрос для привязки DataGridView, и это возвращая заполненную запись tblInstalledProduct с ссылкой на null tblProduct. Я не пробовал называть ее асинхронно из кода, но я уверен, что в обоих случаях он вернет то же самое (и я не совсем уверен, как это сделать это). – Dan

ответ

0

Для тех, у кого есть проблемы с этим, я в конце концов нашел решение. Вам нужно использовать оба параметра .Include() в запросе, чтобы сообщить ему загружать связанные объекты, а также атрибут [Include] в метаданных, чтобы разрешить сериализацию этих связанных объектов и отправить их клиенту.

0

вам нужно сделать что-то вроде этого

tblInstalledProduct selectedInstall = Context.GetInstalledProductsBySiteID("Site1").Where(p=> p.ProductID == 38).FirstOrDefault(); 
     string productName=""; 
     if(selectedInstall !=null) 
     { 
      productName= selectedInstall.tblProduct.ProductName; 
     } 

для тестирования пытаются использовать;

public IQueryable<tblInstalledProduct> GetInstalledProductsNew() 
     { 
      //Im nut Sure of 'tblProduct' or 'tblProducts' it is dependent on your relations 
      return this.ObjectContext.tblInstalledProducts.Include("tblProduct"); 
     } 
+0

Выполнение этой задачи приводит к следующей ошибке: System.ServiceModel.DomainServices.Client.Entit yQuery 'не содержит определения для «Где» – Dan

+0

После добавления «using System.ServiceModel.DomainServices.Client» теперь он говорит: 'не содержит определения для' First'' – Dan

+0

, а затем FirstOrDefault(); –

Смежные вопросы