C# FirstOrDefault在添加后似乎没有调用数据库

C# FirstOrDefault在添加后似乎没有调用数据库,c#,entity-framework,linq,entity-framework-6,C#,Entity Framework,Linq,Entity Framework 6,我有一个web服务,它通过第三方服务发送消息,然后该服务通过设置Sent标志更新我的数据库,它将成功设置为1,失败设置为-1。我的web服务使用代码优先的实体框架模型 Im发送消息,在我的数据库中插入消息记录,然后等待第三方服务更新发送标志: var messageId = sendMessage(); using (var db = new DBModel()) { db.Messages.Add(new Message() { MessageId = mess

我有一个web服务,它通过第三方服务发送消息,然后该服务通过设置Sent标志更新我的数据库,它将成功设置为1,失败设置为-1。我的web服务使用代码优先的实体框架模型

Im发送消息,在我的数据库中插入消息记录,然后等待第三方服务更新发送标志:

var messageId = sendMessage();
using (var db = new DBModel())
{
    db.Messages.Add(new Message()
    {
        MessageId = messageId,
        Sent = 0,
        // Other properties
    });
    db.SaveChanges();
    bool sent = false;
    while (!sent)
    {
        int i = db.Messages.FirstOrDefault(m => m.MessageId == messageId).Sent;
        if (i == -1) throw new Exception();
        sent = i == 1;
    }
}
问题是每次调用FirstOrDefault时,“Sent”总是返回0。但是如果我手动检查数据库中的记录,Sent设置为1,因为它是由第三方服务设置的。 FirstOrDefault似乎正在从缓存返回值,但我的印象是,无论何时调用FirstOrDefault,它都会调用数据库

有人对此有解释吗?有没有办法绕过它


谢谢。

将代码更改为:

DBModel db;
var messageId = sendMessage();
using (db = new DBModel())
{
    db.Messages.Add(new Message()
    {
        MessageId = messageId,
        Sent = 0,
        // Other properties
    });
    db.SaveChanges();
} 

bool sent = false;
while (!sent)
{
    using (db = new DBModel())
    {
        int i = db.Messages.FirstOrDefault(m => m.MessageId == messageId).Sent;
        if (i == -1) throw new Exception();
        sent = i == 1;
    }
}
或:


您可以这样做,将刚刚添加的记录与实体上下文分离。这样,实体框架将被迫再次从数据库中获取它


为此,只需调用detach messageObj,其中messageObj是对添加到表中的消息的引用。请记住在调用save changes后执行此操作,否则将无法创建记录。

作为另一个选项,您可以在上下文中禁用对象缓存:

db.Messages.AsNoTracking().FirstOrDefault(m => m.MessageId == messageId)
返回一个新查询,其中返回的实体将不会缓存在其中 DbContext或ObjectContext


您是否有多封id相同的邮件?如果不是,则它似乎返回了正确的值,因为您正在设置Sent=0。您在哪里将其更改为1?它将被更改为1 my a单独的第三方application@BrianTacker它可能在db.Context.Detach下?嗯,我没有上下文属性,但我可以使用db.Entrymessage.State=EntityState.Detached;这就像一种魅力。谢谢你的帮助。
db.Messages.AsNoTracking().FirstOrDefault(m => m.MessageId == messageId)