gpt4 book ai didi

c# - 回滚与刷新和重新加载实体数据

转载 作者:行者123 更新时间:2023-12-03 11:02:49 25 4
gpt4 key购买 nike

我有一个WPF项目,带有MVVM数据集的EF6,并且我正在寻求实现一种回滚所有更改的方法。

以下代码显示ViewModel如何加载数据:

protected async override void GetData()
{
ThrobberVisible = Visibility.Visible;

ObservableCollection<MobileDeviceRequestVM> _requests = new ObservableCollection<MobileDeviceRequestVM>();

var requests = await (from c in dbContext.MobileDeviceRequests
orderby c.RequestDate
select c)
.ToListAsync();

foreach (MobileDeviceRequest req in requests)
{
_requests.Add(new MobileDeviceRequestVM { IsNew = false, TheEntity = req });
}
MobileDeviceRequests = _requests;
RaisePropertyChanged("MobileDeviceRequests");
ThrobberVisible = Visibility.Collapsed;
}

以下代码显示 ViewModel如何回滚所有更改:
protected override void RollbackData()
{
var changedEntries = dbContext.ChangeTracker.Entries()
.Where(x => x.State != EntityState.Unchanged).ToList();

foreach (var entry in changedEntries)
{
switch (entry.State)
{
case EntityState.Modified:
entry.CurrentValues.SetValues(entry.OriginalValues);
entry.State = EntityState.Unchanged;
break;
case EntityState.Added:
entry.State = EntityState.Detached;
break;
case EntityState.Deleted:
entry.State = EntityState.Unchanged;
break;
}
}

//Somewhere in here the OC: MobileDeviceRequests needs to get refreshed
//with the context as items may have been added and/or deleted

RaisePropertyChanged("MobileDeviceRequests");
}

以下代码显示 ViewModel如何刷新数据,这可能会或可能不会回滚数据,具体取决于是否已更改:
protected virtual void RefreshData()
{
GetData();
}

下面创建一个新的上下文
protected virtual void ReloadData()
{
dbContext= new BAContext();
GetData();
}

我想知道的是:
滚回来

提神醒脑

重装

它们似乎几乎都在做同一件事,而ReloadData()则更昂贵。

我想我要问的是,如果refresh进行了重新查询并填充了OC,回滚是否有任何意义。如果存在,那么您将如何重新填充OC,并且与刷新有什么不同?

最佳答案

前述方法不等效。

当执行LINQ to Entities跟踪查询时,EF将重新查询数据库,但是会考虑返回实体的当前更改跟踪器状态,并将返回本地实体数据而不是实际数据。该概念类似于较旧的RefreshMode.ClientWins方法的ObjectContext.Refresh选项。

刷新的最终效果是最终将带来新数据(通过不同的上下文实例或另一个进程/用户添加到数据库中)。但是当前的修改将继续生效。

因此,海事组织您的选择只有两个-回滚当前内容或使用新的上下文。回滚方法似乎可以实现,但是实体查询仍然不会应用在上下文实异常(exception)部进行的更改。但这无论如何都适用于长期存在的上下文中的跟踪实体查询,因此可能不会被视为缺陷。

选择两者中的哪一个取决于您的要求。但是,保证真正开始的唯一方法是使用新的上下文实例。

关于c# - 回滚与刷新和重新加载实体数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48417229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com