我无法在任何地方找到答案,我希望有人可以帮助我。我是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)之前检索这些新添加的记录回到数据库?
谢谢你, 麦克
答案 0 :(得分:1)
您可以将它们取回,但不能在ObjectQuery中。相反,您必须通过ObjectStateManager并找到添加的实体,然后从中构建绑定列表。这是一种痛苦,并不能很好地发挥作用。
幸运的是,如果您使用EF 4.1及更高版本附带的DbContext,那么数据绑定体验会更好。 DbContext为每种类型的实体提供了一个ObservableCollection作为实体DbSet上的.Local属性。此集合包含用于数据绑定的所有事件,并自动包括新添加的实体,同时还排除标记为删除的实体。可以在此处找到更多信息和演练:http://msdn.microsoft.com/en-us/data/jj574514.aspx