实体框架4 - 客户端上的导航属性对象为空

时间:2011-05-25 20:28:36

标签: entity-framework

我的实体概念模型中有两个感兴趣的表:tblProducts和tblInstalledProducts。

每个已安装的产品都有一个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。尝试从客户端访问任何tblInstalledProduct的tblProduct属性时出现问题。

//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在服务端按预期加载,但在客户端看似无法访问?

感谢阅读。

编辑:

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>

2 个答案:

答案 0 :(得分: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");
        }

答案 1 :(得分:0)

对于其他任何有此问题的人,我最终找到了解决方案。您需要在查询中使用.Include()来告诉它加载相关对象,以及元数据中的[Include]属性,以允许这些相关对象被序列化并发送到客户端。