【问题标题】:how to bind data from entityframework to datagrid?如何将实体框架中的数据绑定到数据网格?
【发布时间】:2014-02-02 03:56:58
【问题描述】:

我有 2 个表 CustomerOrder 客户 ID 是主键,它与订单键有外键关系。所以我想在数据网格中显示客户并在由另一个数据网格组成的 RowDetailsTemplate 中排序。

下面是 XAML

   <Grid>
        <DataGrid AutoGenerateColumns="True" Name="dataGrid1">
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding Order}" AutoGenerateColumns="True"/>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>

在代码隐藏中我写了以下代码

    public MainWindow()
    {
        InitializeComponent();
        SampleDBEntities1 context = new SampleDBEntities1();
        dataGrid1.ItemsSource = context.Customers.ToList();           
    }

这里我无法绑定内部数据网格。

下面是上下文类

public partial class SampleDBEntities1 : DbContext
{
    public SampleDBEntities1()
        : base("name=SampleDBEntities1")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<Customer> Customers { get; set; }
    public DbSet<Order> Orders { get; set; }
}

以下是实体框架为客户和订单生成的类

public partial class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string City { get; set; }

    public virtual Order Order { get; set; }
}

public partial class Order
{
    public int ID { get; set; }
    public string Number { get; set; }

    public virtual Customer Customer { get; set; }
}

【问题讨论】:

  • 我看不到您将视图绑定到 ViewModel。比如说,在 MainWindow 构造函数中添加这一行 - this.DataContext = new MyViewModel()。可能这就是你错过的东西。
  • 首先在“context.Customers.ToList()”上放一个断点,看看你是否得到了值。如果您正在获取值,请使用 snoop 并检查为什么您的值没有加载到 Datagrids 中。

标签: c# wpf linq entity-framework data-binding


【解决方案1】:

您需要告诉实体框架预先加载订单,否则它不会加载它们...

dataGrid1.ItemsSource = context.Customers.Include("Order").ToList();

或者

dataGrid1.ItemsSource = context.Customers.Include(c => c.Order).ToList();

(需加using System.Data.Entity;)

如果删除.ToList(),它也应该可以工作,但它会延迟加载每个客户的订单,最终会出现 Select(n+1) 问题。

【讨论】:

  • 可以先将列表保存到变量中吗? var customers = context.Customers.Include(c =&gt; c.Order).ToList(); 然后添加断点并检查客户是否填充正确?谢谢。
  • 但我想要内部网格中的订单列表而不是外部网格中的订单列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2023-03-25
  • 2023-03-06
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多