即使数据未保存在数据库中,绑定也会更新

本文关键字:绑定 更新 数据库 数据 保存 存在 | 更新日期: 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需要在绑定到视图的属性上实现,这将确保回滚执行的任何更改都将被推回到视图。