即使数据未保存在数据库中,绑定也会更新
本文关键字:绑定 更新 数据库 数据 保存 存在 | 更新日期: 2023-09-27 18:29:15
我有一个数据库,其中包含要ping的IP地址的服务器(目前为伪数据)。ping成功后,服务器状态将设置为联机。
我运行了应用程序,更改显示在应用程序和数据库中。所以我觉得一切都很好。
直到我注释掉保存到数据库部分。事实上,这些更改不会保存到数据库中。但是,更改确实显示了,所以我的绑定确实得到了更新。
我希望应用程序中显示的数据与数据库匹配。因此,当保存到DB失败时,应用程序数据不会更改,应用程序和DB仍然匹配。
这是代码,我希望你能帮我:)
// Get all servers that have an IP adress.
var query =
from server in dataEntities.Server
where server.IPAdress != null
select server;
// Ping the servers from the query.
foreach (Server server in query)
{
IPAdress = server.IPAdress;
Boolean online = checkPing.sendPing(IPAdress);
// Change the status according to the ping result.
if (online == true)
server.Status = true;
else if (online == false)
server.Status = false;
}
// Save the changes in status in the DB.
/*try
{
dataEntities.SaveChanges();
}
catch (Exception oops)
{
Console.WriteLine(oops);
// Provide for exceptions.
}*/
如果SaveChanges
失败,则需要将实体的值回滚到原来的值。
在DbContext
类中,您可以添加一个名为Rollback
的方法,它看起来像这样:
public class MyDbContext : DbContext
{
//DataSets and what not.
//...
public void Rollback()
{
//Get all entities
var entries = this.ChangeTracker.Entries().ToList();
var changed = entries.Where(x => x.State != EntityState.Unchanged).ToList();
var modified = changed.Where(x => x.State == EntityState.Modified).ToList();
var added = changed.Where(x => x.State == EntityState.Added).ToList();
var deleted = changed.Where(x => x.State == EntityState.Deleted).ToList();
//Reset values for modified entries
foreach (var entry in modified)
{
entry.CurrentValues.SetValues(entry.OriginalValues);
entry.State = EntityState.Unchanged;
}
//Remove any added entries
foreach (var entry in added)
entry.State = EntityState.Detached;
//Undo any deleted entries
foreach (var entry in deleted)
entry.State = EntityState.Unchanged;
}
}
您可以简单地在catch
:中调用此方法
try
{
dataEntities.SaveChanges();
}
catch (Exception oops)
{
//Rollback all changes
dataEntities.Rollback();
}
请注意,INotifyPropertyChanged
需要在绑定到视图的属性上实现,这将确保回滚执行的任何更改都将被推回到视图。