在保存更改之前检索实体记录

时间:2012-10-19 17:24:44

标签: wpf linq entity-framework

我无法在任何地方找到答案,我希望有人可以帮助我。我是WPF和实体框架的新手,所以可能做错了。

我遇到了创建新记录并将其添加到Entity集合的情况。我不想在它上面执行SaveChanges()以允许用户完成他们想要做的所有事情,然后在离开表单之前进行最终保存。我的问题是,在将记录添加到Entity集合之后,我无法将它们检索回来显示“直到”他们已经在实体上运行了SaveChanges()。

这基本上是使用两个DataGrids的Master-Child显示,但主网格源是List<>正在构建,因为表中的一个字段需要转换为更加用户友好的显示。这一切都来自一个表,我只是根据3个字段(作为主数据)对数据进行分组,然后将子网格显示为该分组的详细信息。

此操作是一个“复制”操作,我正在使用现有的DataGrid数据显示,并让用户将数据复制到“新”主组。我正在使用以下内容创建这组新记录。

            RateGroupRow rgr = new RateGroupRow();
            rgr.StaffRole = rg.SelectedStaffRole;
            rgr.Department = rg.SelectedDepartment;
            rgr.PlanYear = rg.SelectedPlanYear;
            _rateGroupQuery.Add(rgr);

            foreach (var item in dgRateValues.Items)
            {
                if (item.GetType() == typeof(CommissionRate))
                {
                    CommissionRate cr = (CommissionRate)item;
                    CommissionRate newcr = new CommissionRate();
                    newcr.StaffRole = Common.StaffTextToStaffType(rgr.StaffRole);
                    newcr.Department = rgr.Department;
                    newcr.PlanYear = rgr.PlanYear;
                    newcr.Low = cr.Low;
                    newcr.High = cr.High;
                    newcr.Rate = cr.Rate;
                    Common.CommissionsEntities.CommissionRates.AddObject(newcr);
                }
            }
            //TODO:  Don't want to do this SaveChanges here but for now that's the only way I can get these new records to be displayed in the data selection.
            //Common.CommissionsEntities.SaveChanges();

            dgRateGroups.ItemsSource = null;
            dgRateGroups.ItemsSource = _rateGroupQuery;
            dgRateGroups.SelectedIndex = dgRateGroups.Items.Count - 2;

将主记录添加到_rateGroupQuery之后,DataGrid(dgRateGroups)选择SelectionChanged查询数据的行,以便将详细信息DataGrid填充为:

    dgRateValues.ItemsSource = null;
    _CurrentSelectedStaffRole = rateGroupRow.StaffRole;
    _CurrentSelectedDepartment = rateGroupRow.Department;
    _CurrentSelectedPlanYear = rateGroupRow.PlanYear;
    string StaffNameType = Common.StaffTextToStaffType(_CurrentSelectedStaffRole);

    var CommissionRatesItems =
        from cr in Common.CommissionsEntities.CommissionRates
        where cr.StaffRole == StaffNameType &&
              cr.Department == _CurrentSelectedDepartment &&
              cr.PlanYear == _CurrentSelectedPlanYear
        orderby cr.Low
        select cr;
    ObjectQuery<CommissionRate> CommissionRatesQuery = CommissionRatesItems as ObjectQuery<CommissionRate>;
    dgRateValues.ItemsSource = CommissionRatesQuery.Execute(MergeOption.AppendOnly);

我从这个选择中没有回复记录。如果我在添加记录后执行'SaveChanges()'调用,那么一切正常。

那么有没有办法在将这些新添加的记录提交(SaveChanges)之前检索这些新添加的记录回到数据库?

谢谢你, 麦克

1 个答案:

答案 0 :(得分:1)

您可以将它们取回,但不能在ObjectQuery中。相反,您必须通过ObjectStateManager并找到添加的实体,然后从中构建绑定列表。这是一种痛苦,并不能很好地发挥作用。

幸运的是,如果您使用EF 4.1及更高版本附带的DbContext,那么数据绑定体验会更好。 DbContext为每种类型的实体提供了一个ObservableCollection作为实体DbSet上的.Local属性。此集合包含用于数据绑定的所有事件,并自动包括新添加的实体,同时还排除标记为删除的实体。可以在此处找到更多信息和演练:http://msdn.microsoft.com/en-us/data/jj574514.aspx