I have an EF ie EF6 project, in which I inject my DBContext and I have few LinQ query on it as shown.. GetUnSentMessages() brings cached data back, as when I change value in the database, it does not reflect in my query result.. Could you please suggest, where am I going wrong and what's the solution.. Thank you
update - GetUnSentMessages() picks up unsent messages.. UpdateMessageStatus() - is called after the unsent messages have been sent.
So if I go back and change any value for a record in the SMSMessage table, its not picked up by GetUnsentMessages query..It still bring back the old data..ie its caching things..
namespace SMSSender.Repositories
{
public class SenderRepository : ISenderRepository
{
private SMSEntities entities;
private ILog logger;
public SenderRepository(SMSEntities entities, ILog logger)
{
this.entities = entities;
this.logger = logger;
}
public IEnumerable<SMSMessage> GetUnSentMessages()
{
return entities.SMSMessage.Where(item => item.TimeSent == null && item.Deleted == 0 && item.StatusID == 0).ToList();
}
public void UpdateMessageStatus(int messageId, string mobileNo, short status)
{
var message = entities.SMSMessage.Where(item => item.MessageID == messageId && item.MobileNo == mobileNo).FirstOrDefault();
if (message != null)
{
message.StatusID = status;
message.TimeSent = DateTime.Now;
entities.Entry(message).State = System.Data.Entity.EntityState.Modified;
entities.SaveChanges();
}
}
}
}
update 2 - Changed my code to this after @Jaroslav Surala suggested article and it works fine, not sure if its the best/right approach -
namespace SMSSender.Repositories
{
public class SenderRepository : ISenderRepository
{
private SMSEntities entities;
private ILog logger;
public SenderRepository(SMSEntities entities, ILog logger)
{
this.entities = entities;
this.logger = logger;
}
public IEnumerable<SMSMessage> GetUnSentMessages()
{
return entities.SMSMessage.AsNoTracking().Where(item => item.TimeSent == null && item.Deleted == 0 && item.StatusID == 0).AsNoTracking().ToList();
}
public void UpdateMessageStatus(int messageId, string mobileNo, short status)
{
var message = entities.SMSMessage.AsNoTracking().Where(item => item.MessageID == messageId && item.MobileNo == mobileNo).FirstOrDefault();
if (message != null)
{
message.StatusID = status;
message.TimeSent = DateTime.Now;
entities.Set<SMSMessage>().AddOrUpdate(message);
entities.SaveChanges();
}
}
}
}
}