我在数据库中有两个表,并使用实体框架和ria服务在简单的数据网格中显示数据。这是数据库/ EF结构
Cars Make
----- ----
CarId MakeId
Car Make
MakeId
在我的Silverlight数据网格中,我想显示以下两列,例如
Car Make
--- -----
Escort Ford
Megane Renault
Rav4 Toyota
我可以很容易地绑定到Cars表并显示汽车,但我无法弄清楚如何显示从子表中取得的内容
我用来配置数据网格的xaml如下:
<datagrid:DataGrid x:Name="CarGrid" AutoGenerateColumns="False" MinHeight="100" IsReadOnly="True" ItemsSource="{Binding ElementName=MyData, Path=Data}">
<datagrid:DataGrid.Columns>
<datagrid:DataGridTextColumn Header="Car" Binding="{Binding Car}"/>
<datagrid:DataGridTextColumn Header="Make" Binding="{Binding Cars.Make}"/>
......
datagrid数据源绑定到DomainDataSource方法“GetCars”。我不确定它是否自动加载子表(不确定我是否必须明确告诉它,并且不知道如何在xaml中执行此操作)。
我确信我可以抛弃xaml并在c#中完成它,但我想成为一名优秀的编码器并在xaml中完成。
答案 0 :(得分:2)
我找到了一个很好的解决方案。我们试试这个:http://jeffhandley.com/archive/2010/03/12/lookupdata.aspx
然后不要忘记在您的域服务类的查询查找中“包含”您的子表。
例如:
public IQueryable<Car> GetCars()
{
return this.ObjectContext.Cars.Include("Make");
}
用您自己的名称替换名称。
PS:请记住执行博客指示的所有步骤。
答案 1 :(得分:1)
除非您在某处明确指定它(例如使用Linq-to-SQL的DataContext.LoadOptions
),否则子记录不会自动加载父记录。
以下是Linq-to-SQL中的完成方式:
List<tblInventory> result;
using (var dc = new SMDataContext())
{
dc.Log = Console.Out;
var dlo = new DataLoadOptions();
dlo.LoadWith<tblInventory>(x => x.tblItemInfo);
dc.LoadOptions = dlo;
var q = (from o in dc.tblInventories
select o).Take(10);
result = q.ToList();
}
这是结果日志:
SELECT TOP 10 [t0].[fldItemPrivateSN], [t0].[fldCatNo], [t0].[fldSerNo], ...
..., [t1].[fldWeight], [t1].[fldValue], ...
FROM [dbo].[tblInventory] AS [t0]
INNER JOIN [dbo].[tblItemInfo] AS [t1] ON [t1].[fldCatNo] = [t0].[fldCatNo]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.1
更新:此外,您似乎绑定到Cars.Make
,尝试绑定到Car.Make
。
答案 2 :(得分:1)
您需要将Make列的绑定更改为Car.Make,并且您需要确保EF填充此属性。
我建议将调试器附加到服务并检查EF的内容。
您还可以将SQL事件探查器附加到SQL Server实例,并查看正在运行的EF查询。
答案 3 :(得分:0)
迈克希尔伯格的文章解决了你感兴趣的大部分内容:
和Manish Dalal的文章一样:http://weblogs.asp.net/manishdalal/archive/2008/09/28/combobox-in-datagrid.aspx
即使借助这些示例,我也很难实现与您相同的东西(使用手工制作的MVVM而不是RIA)。
我最终得到了一个不妥协的黑客,它确实破坏了底层对象(你想要避免的东西),这很难。
祝你好运。