我有一个通过第三方服务发送消息的 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/