c# - 添加后 FirstOrDefault 似乎没有调用数据库

标签 c# entity-framework linq entity-framework-6

我有一个通过第三方服务发送消息的 Web 服务,然后该服务通过设置“已发送”标志来更新我的数据库(成功时将其设置为 1,失败时将其设置为 -1)。我的 Web 服务正在使用代码优先 Entity Framework 模型。

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

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;
    }
}

或者:

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

    db.Messages.Add(message);
    db.SaveChanges();
    bool sent = false;
    while (!sent)
    {
        db.Detach(message); // <<< This part
        message = db.Messages.FirstOrDefault(m => m.MessageId == messageId);
        var i = message.Sent;
        if (i == -1) throw new Exception();
        sent = i == 1;
    }
}

关于c# - 添加后 FirstOrDefault 似乎没有调用数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32514466/

相关文章:

performance - Entity Framework 查询速度

c# - 在空 IEnumerable<int> 上为 FirstOrDefault() 返回 null?

.net - LinQ 到对象 GroupBy() 按对象和 Sum() 按数量

C#/Linq - 排序 IDictionary

c# - 从抽象类传递枚举作为参数

C# winforms numericupdown控件

c# - 使用 Database.SetInitializer 避免霰弹枪手术

c# - 是否可以将 SqlGeography 与 Linq to Sql 一起使用?

c# - Nadio - 多声音设备播放和录音问题

c# - 数据库设置不正确,IList 上的值为空