Вы не предоставили много кода, что вы делаете в InsertIfNotExists, но, как я вижу, ваша проблема в том, что у вас есть context.SaveChanges ();в конце концов, это означает, что сначала вы изменяете в памяти, затем сохраняете, что означает, что одновременно вы можете иметь несколько экземпляров, делающих одно и то же.Здесь наиболее важно быстро вставить в базу данных, но даже это не гарантирует одну вставку за раз.
Так что я вижу несколько вариантов здесь
Вариант 1. Вы также можете попробовать перехватить, и в случае ошибки просто совершите вторую поездку, чтобы получить по id, так как вы знаете, что запись вставлена.
Вариант 2. В Transact SQL есть оператор слияния, который на самом деле выполняет команду upsert.Если вы используете ядро Entity Framework (вы не указали его ядро или нет, но я предполагаю его ядро), вы можете использовать extension
DataContext.DailyVisits
.Upsert(new DailyVisit
{
UserID = userID,
Date = DateTime.UtcNow.Date,
Visits = 1,
})
.On(v => new { v.UserID, v.Date })
.WhenMatched(v => new DailyVisit
{
Visits = v.Visits + 1,
})
.RunAsync();
Вариант 3. Будет использовать транзакции.