gpt4 book ai didi

c# - SaveChanges 后如何从数据库更新缓存的 EF?

转载 作者:行者123 更新时间:2023-11-30 18:05:06 26 4
gpt4 key购买 nike

场景如下 - 不同的用户通过从网页的下拉列表中选择一个值来进行更改。下拉列表包含在 DataView 中或通过构建表格。如果用户 A 对第 1 行进行了更改,它会更新数据库并在重新绑定(bind)后显示他们的更改。随后,当用户 A 进行更改并更改第 2 行时,用户 B 在同一页面上。更新数据库并重新绑定(bind) GridView (或重建表)。但是用户 B 看不到用户 A 所做的更改。我假设这是由于 EF 缓存。如果用户刷新页面(或被重定向回页面),他们可以看到数据库中的最新数据。

如何在不刷新页面的情况下从数据库获取最新数据?

每次在 PageLoad 中调用绑定(bind)的方法,包括回传:

    private void PopulateFormForDealer(DateTime BeginDate, DateTime EndDate, int DealerID, bool UnVerifiedOnly)
{
try
{
using (var DB = new NIMSModel.NIMSEntities())
{

var scheduledOrders = from r in DB.Reservations
join o in DB.Orders on r.ResID equals o.ReservationID
where r.ResDate <= EndDate && r.ResDate >= BeginDate && r.Claimed == "Y"
&& r.DealerID == DealerID //&& r.Verified == VerifiedOnly
orderby r.ResDate, r.ResID
select new { r.ResID, o.ID, o.VantiveOrderID, o.CustomerFirstName, o.CustomerCity, o.CustomerState, o.CustomerZipCode, o.OrderType.Type, r.ResDate, r.TimeOfDay, r.Source, DealerInstallerID = r.DealerInstallerID == null ? 0 : r.DealerInstallerID, r.Verified, r.Notes };


GridView1.DataSource = scheduledOrders.ToList();
GridView1.DataBind();

}
}
catch (Exception ex)
{
LogError(ex);
}

这是下拉列表的事件处理程序:

    protected void ddInstaller_SelectedIndexChanged(Object sender, EventArgs e)
{
try
{
string foo = ((DropDownList)sender).SelectedValue;
Guid theg = new Guid(((DropDownList)sender).SelectedValue.Split('_')[1].ToString());
int? installerid = int.Parse(((DropDownList)sender).SelectedValue.Split('_')[0].ToString());
string installername = ((DropDownList)sender).SelectedItem.Text;

if (installerid == 0)
{
installerid = null;
}

int testvalidguidlen = theg.ToString().Replace("0", "").Length;
if (testvalidguidlen > 10)
{
string note;
using (var DB = new NIMSModel.NIMSEntities())
{
var reservatoins = DB.Reservations.Where(r => r.ResID == theg).FirstOrDefault();

if (reservatoins.DealerInstallerID != installerid)
{
var orders = DB.Orders.Where(o => o.ReservationID == theg).FirstOrDefault();

reservatoins.DealerInstallerID = installerid;
orders.InstallerID = installerid;

if (reservatoins.Notes == null || reservatoins.Notes.Length >= 1800)
{
note = "[" + DateTime.Now.ToString("yyyy.MM.dd hh:mm:ss") + "] TechChange by: " + PTNAccount.UserName + "(" + PTNAccount.LoginID + "); NewTech: " + installername + ";";
}
else
{
note = reservatoins.Notes + "[" + DateTime.Now.ToString("yyyy.MM.dd hh:mm:ss") + "] TechChange by: " + PTNAccount.UserName + "(" + PTNAccount.LoginID + "); NewTech: " + installername + ";";
}
reservatoins.Notes = note;

DB.SaveChanges();
}
}
}
}
catch (Exception ex)
{
LogError(ex);
}

这里是我们构建下拉列表的方法:

    private DropDownList PopulateInstallerDropDownList(DropDownList ddl, String resID)
{

try
{
using (var DB = new NIMSModel.NIMSEntities())
{
var DealerInstallers = from di in DB.DealerInstallers
where di.Active == 1 && di.IsDeleted == "N" && di.DealerID == DealerID
orderby di.Name
select new { di.ID, di.Name };
var DealerInstallersArray = DealerInstallers.ToArray();
ListItem li = new ListItem("","0_" + resID);
ddl.Items.Add(li);

foreach (var installer in DealerInstallersArray)
{
ddl.Items.Add(new ListItem(installer.Name.ToString(), (installer.ID.ToString() + (string)"_" + resID.ToString())));
}
}
}
catch (Exception ex)
{
string foo = ex.Message;
}
return ddl;

这是 RowDataBound 事件处理程序:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{

if (e.Row.RowType == DataControlRowType.DataRow)
{
string reservationID = DataBinder.Eval(e.Row.DataItem, "ResID").ToString();
DropDownList ddl = (DropDownList)e.Row.FindControl("ddInstaller");
PopulateInstallerDropDownList(ddl, reservationID);
string dealerInstallerId = DataBinder.Eval(e.Row.DataItem, "DealerInstallerID").ToString();

if (dealerInstallerId != "0")
{
dealerInstallerId = dealerInstallerId + "_" + reservationID;
}

if (dealerInstallerId.Length > 1)
{
ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(dealerInstallerId));
}
}
}

过去两天我多次搜索解决方案。感谢您的帮助。

最佳答案

Entity Framework 3.5 以令人难以置信的方式保存更改,但它在 EF 4.0 中已修复我猜你使用的是 EF 3.5

悬停你需要知道你的数据发生了什么以及 EF 如何保存数据。你可以阅读 MSDN关于这个问题。

现在您可以在保存更改时调用刷新方法来更新数据。

context.Refresh(RefreshMode.ClientWins, orders);

英孚 4.0 > 英孚 3.5

关于c# - SaveChanges 后如何从数据库更新缓存的 EF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871406/

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