Как искать сущность до SaveChanges - PullRequest
0 голосов
/ 22 мая 2018

Этот вопрос связан с этим вопросом .

Мне нужно найти объект Подпись , прежде чем он станет доступен через SaveChanges.

Это функция, которая ищет и добавляет, если не найден, Подпись :

public static async Task<int?> TryUpdateSignature(MyDbContext db, Signature oldSignUser, Date? newDate, string userName)
{
    int? SignatureID = null; //Returns null if no date

    //Validate if there is a new date
    if ((IsNothing(oldSignUser) && newDate != null) || (oldSignUser != null && oldSignUser.DateSign != newDate))
    {
        Signature recSignature = Await db.Signature.FirstOrDefaultAsync(s => s.UserID == userName && s.DateSign == newDate);
        if (IsNothing(recSignature))
        {
            recSignature = new Signature;
            recSignature.UserID = userName;
            recSignature.DateSign = newDate;
            db.Signature.Add(recSignature);
        }

        SignatureID = recSignature.SignatureID;
    }
    else if (oldSignUser != null && newDate != null)
    {       //If no change, keep old signature
        SignatureID = oldSignUser.SignatureID;
    }

    return SignatureID;
}

Проблема возникает, когда она вызывается несколько раз во времятот же Редактировать пост.В первый раз он создает новую подпись и возвращает новый идентификатор.Однако во второй раз он должен найти первую подпись и вернуть свой идентификатор, но вместо этого создает новую подпись , поскольку первая находится только в памяти.

Я знаю, что функция Find может заглянуть в память на скорость, но для этого требуется идентификатор, поэтому не повезло.

Грязным решением было бы вызывать SaveChanges после каждогодобавить, но я бы предпочел не.

Любой вклад будет оценен.

1 Ответ

0 голосов
/ 23 мая 2018

Я верю в этот сценарий, так как это тот же DbContext, который вы можете сначала перейти в Local DbSet, чтобы попытаться найти соответствующую сущность, прежде чем делать FirstOrDefault, который перейдет в БД.

Signature recSignature = db.Signature.Local.FirstOrDefault(s => s.UserID == userName && s.DateSign == newDate);
if (IsNothing(recSignature))
{
  recSignature = Await db.Signature.FirstOrDefaultAsync(s => s.UserID == userName && s.DateSign == newDate);
}

if (IsNothing(recSignature))
{
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...