В моей концептуальной модели моего объекта есть две таблицы, представляющие интерес: 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>
* "Я пытался .INCLUDE()" * - Так 'Context.tblInstalledProducts.Include ("tblProduct") .гд (' не работает –
, почему вы не звонили GetInstalledProductsBySiteID на стороне клиента? ? –
@BlueRaja: System.ServiceModel.DomainServices.Client.EntitySet 'не содержит определения для' Include ' @Waleed: Я использую этот запрос для привязки DataGridView, и это возвращая заполненную запись tblInstalledProduct с ссылкой на null tblProduct. Я не пробовал называть ее асинхронно из кода, но я уверен, что в обоих случаях он вернет то же самое (и я не совсем уверен, как это сделать это). –
Dan